两个c程序测试机器性能

来源:互联网 发布:sql 2005什么用 编辑:程序博客网 时间:2024/04/30 18:37

拿两个小程序来测试机器性能

  • crash.c
#include <stdio.h>#include <stdlib.h>void f();int main(int argc,char* argv[]){    int input =0;        int i;    printf("Input an integer:");    scanf("%d", &input);    printf("The integer you input is %d\n", input);        for(i=0;i<input;i++)          f();    return 0;}void f(){        int *a;        a=(int*)malloc(10*sizeof(*a));        free(a);        return;}
  • matmul.c
#include "stdio.h"#include "stdlib.h"#include <math.h>#include <sys/time.h>#define USEMKL 0#if USEMKL#include "mkl.h"#endif#define N 10000#define mat(A, i, j)  (*(A+i*N+j))voidgen_mat(double* A, double* B){    int i,j;    for(i=0;i<N;i++)        for(j=0;j<N;j++){          mat(A,i,j)=-1+2.0*rand()/(RAND_MAX+1.0);          mat(B,i,j)=-1+2.0*rand()/(RAND_MAX+1.0);     }    return;}voidcheck_result(double* A, double* B, double* C){   double res1, res2;   int i,j,k;#if USEMKL    struct timeval st, et;#endif   res1=0;   for(i=0;i<N;i++)       for(j=0;j<N;j++){          res1=res1+fabs(mat(C,i,j));          mat(C,i,j)=0.;   }#if USEMKL    gettimeofday(&st,NULL);    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,                 N, N, N, 1.0, A, N, B, N, 0.0, C, N);    gettimeofday(&et,NULL);    printf("MKL:  time: %0.6lf sec\n", et.tv_sec+et.tv_usec*1e-6-st.tv_sec-st.tv_usec*1e-6);#else   for(i=0;i<N;i++)       for(j=0;j<N;j++)           for(k=0;k<N;k++)   {               mat(C,i,j)=mat(C,i,j)+mat(A,i,k)*mat(B,k,j);   }#endif   res2=0;   for(i=0;i<N;i++)       for(j=0;j<N;j++){          res2=res2+fabs(mat(C,i,j));   }   res1-=res2;   if(fabs(res1/res2) < 1e-10)       printf("MatMul. passed!\n");   else       printf("MatMul. faild %e/%e=%e\n", res1, res2, res1/res2);}/* Need to be Opt. */voidmatmul(double *A, double *B, double *C){   int i, j, k;   for(i=0;i<N;i++)       for(j=0;j<N;j++){           mat(C,i,j)=0.;   }           for(k=0;k<N;k++)       for(j=0;j<N;j++)   for(i=0;i<N;i++)           {               mat(C,i,j)=mat(C,i,j)+mat(A,i,k)*mat(B,k,j);           }   return;}int main(int argc, char* argv[]){    double *A,*B,*C;    struct timeval st, et;    A = (double*) calloc( N, N * sizeof(double));    B = (double*) calloc( N, N * sizeof(double));    C = (double*) calloc( N, N * sizeof(double));    gen_mat(A,B);    printf("Gen matrix finished!\n");    gettimeofday(&st,NULL);    matmul(A,B,C);    gettimeofday(&et,NULL);/*    if( et.tv_usec < st.tv_usec )    {        et.tv_sec = et.tv_sec - st.tv_sec - 1;        et.tv_usec = et.tv_usec + (1000000 - st.tv_usec);    }    else    {        et.tv_sec -= st.tv_sec;        et.tv_usec -= st.tv_usec;    }*/    printf("matrix mult. time: %0.6lf sec\n", et.tv_sec+et.tv_usec*1e-6-st.tv_sec-st.tv_usec*1e-6);    check_result(A,B,C);    free(A);    free(B);    free(C);    return 0;}

前一个体验在内存中开辟空间所需的时间,后一个做一个大规模矩阵的乘法,看看所需要的时间。

这里写图片描述

0 0
原创粉丝点击