#ifdef UTEST #include #include #include #include /* fabs */ #include "blis_utest.h" #include "bli_gemm_power7_opt_8x4.h" #define COLMAJ_INDEX(row,col,ld) ((col*ld)+row) #define ROWMAJ_INDEX(row,col,ld) ((row*ld)+col) #define BLIS_INDEX(row,col,rs,cs) ((row*rs)+(col*cs)) #define MR BLIS_DEFAULT_MR_D #define NR BLIS_DEFAULT_NR_D #define LDA MR #define LDB NR #define EPSILON 0.0000001 /* * Perform * c = beta * c + alpha * a * b * where * alpha & beta are scalars * c is mr x nr in blis-format, (col-stride & row-stride) * a is mr x k in packed col-maj format (leading dim is mr) * b is k x nr in packed row-maj format (leading dim is nr) */ void bli_dgemm_check( dim_t k, double* restrict alpha, double* restrict a, double* restrict b, double* restrict beta, double* restrict c, inc_t rs_c, inc_t cs_c, auxinfo_t* data ) { int i, j, kk; double c00; for (i=0; i < MR; i++) { for (j=0; j < NR; j++) { c00 = c[BLIS_INDEX(i,j,rs_c,cs_c)] * *beta; for (kk=0; kk < k; kk++) c00 += *alpha * (a[COLMAJ_INDEX(i,kk,LDA)] * b[ROWMAJ_INDEX(kk,j,LDB)]); c[BLIS_INDEX(i,j,rs_c,cs_c)] = c00; } } } int main(int argc, char *argv[]) { double *A, *B, *C, *C2; double alpha = 1.0, beta = 1.0; long i, j; long k = 128; int iters = 10; int errors; struct timeval tv_start, tv_end; switch (argc) { case 2: k = atoi(argv[1]); case 1: break; default: printf("Usage: %s [k]\n", argv[0]); return 1; break; } //long rs_c = 1, cs_c = MR; // Column major long rs_c = NR, cs_c = 1; // Row major A = (double*)malloc(LDA * k * sizeof(double)); B = (double*)malloc(LDB * k * sizeof(double)); C = (double*)malloc(MR * NR * sizeof(double)); C2 = (double*)malloc(MR * NR * sizeof(double)); /* Initialize C matrix in blis format */ for (j=0; j EPSILON) { if (errors<20) printf(" %ld expected=%f got=%f\n", i, C2[i], C[i]); errors++; } } printf("Errors = %d\n", errors); if (errors) { return -1; } /* Now get the performance */ gettimeofday(&tv_start, NULL); for (i=0; i