mmtst.c

来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 624 行 · 第 1/2 页

C
624
字号
      Mjoin(NBmm0,_b1)(m_, n_, k_, *(alp_), a_, lda_, (b_)+1, ldb_, \                       rone, (c_)+1, ldc_); \   }#endif#if 0   #undef NBmm   #define NBmm(m_, n_, k_, alp_, a_, lda_, b_, ldb_, bet_, c_, ldc_) \   { \      zgemm_("T", "N", &(m_), &(n_), &(k_), alp_, a_, &(lda_), b_, \             &(ldb_), bet_, c_, &(ldc_)); \   }#endif#endifvoid tst_mm(const int M, const int N, const int K, const SCALAR alpha,            const TYPE *A, const int lda0, const TYPE *B, const int ldb0,            const SCALAR beta, TYPE *C, const int ldc0){   int i, j, k;   int lda = lda0 SHIFT, ldb = ldb0 SHIFT, ldc = ldc0 SHIFT;   register TYPE c0;   #ifdef TREAL      for (j=0; j < N; j++)      {         for (i=0; i < M; i++)         {            c0 = 0.0;            for (k=0; k < K; k++)            {               #if defined(NoTransA) && defined(NoTransB)                  c0 += A[i+k*lda] * B[j*ldb+k];               #elif defined(NoTransA) && defined(TransB)                  c0 += A[i+k*lda] * B[j+k*ldb];               #elif defined(TransA) && defined(NoTransB)                  c0 += A[i*lda+k] * B[j*ldb+k];               #elif defined(TransA) && defined(TransB)                  c0 += A[i*lda+k] * B[j+k*ldb];               #endif            }            C[i+j*ldc] = beta*C[i+j*ldc] + alpha*c0;         }      }   #else      register TYPE cr, ci, ar, ai, br, bi;/* *    If matrix is stored split into real & imaginary parts, allocate some *    matrices and intermix them for f77-like imaginary matrices */      #if csA == 1 && csB == 1         int inc, ldaa, ldbb, lda2=lda/2, ldb2=ldb/2;         TYPE *aa, *bb;         aa = malloc(M*K*sizeof(TYPE)*2);         bb = malloc(K*N*sizeof(TYPE)*2);         assert(aa && bb);         #ifdef NoTransA            ldaa = M*2;            inc = K*lda2;            for (k=0; k < K; k++)            {               j = k*lda;               for (i=0; i < M; i++)               {                  aa[k*ldaa+2*i]   = A[inc+k*lda2+i];                  aa[k*ldaa+2*i+1] = A[k*lda2+i];               }            }         #else            ldaa = K*2;            inc = M*lda2;            for (i=0; i < M; i++)            {               for (k=0; k < K; k++)               {                  aa[i*ldaa+2*k]   = A[inc+i*lda2+k];                  aa[i*ldaa+2*k+1] = A[i*lda2+k];               }            }         #endif         #ifdef NoTransB            inc = N*ldb2;            ldbb = K*2;            for (j=0; j < N; j++)            {               for (k=0; k < K; k++)               {                  bb[j*ldbb+2*k]   = B[inc+j*ldb2+k];                  bb[j*ldbb+2*k+1] = B[j*ldb2+k];               }            }         #else            inc = K*ldb2;            ldbb = N*2;            for (k=0; k < K; k++)            {               for (j=0; j < N; j++)               {                  bb[k*ldbb+2*j]   = B[inc+k*lda2+j];                  bb[k*ldbb+2*j+1] = B[k*lda2+j];               }            }         #endif         A = (const TYPE *) aa;         B = (const TYPE *) bb;         lda = ldaa;         ldb = ldbb;      #endif      for (j=0; j < N; j++)      {         for (i=0; i < M; i++)         {            cr = ci = 0.0;            for (k=0; k < K; k++)            {               #if defined(NoTransA) && defined(NoTransB)                  ar = A[2*i+k*lda];                  ai = A[2*i+k*lda+1];                  br = B[j*ldb+2*k];                  bi = B[j*ldb+2*k+1];               #elif defined(NoTransA) && !defined(NoTransB)                  ar = A[2*i+k*lda] ;                  ai = A[2*i+k*lda+1];                  br = B[2*j+k*ldb];                  bi = B[2*j+k*ldb+1];               #elif !defined(NoTransA) && defined(NoTransB)                  ar = A[i*lda+k*2];                  ai = A[i*lda+k*2+1];                  br = B[j*ldb+k*2];                  bi = B[j*ldb+k*2+1];               #elif !defined(NoTransA) && !defined(NoTransB)                  ar = A[i*lda+k*2];                  ai = A[i*lda+k*2+1];                  br = B[2*j+k*ldb];                  bi = B[2*j+k*ldb+1];               #endif               #ifdef ConjTransA                  ai = -ai;               #endif               #ifdef ConjTransB                  bi = -bi;               #endif               cr += ar * br - ai * bi;               ci += ar * bi + ai * br;            }/* *          Scale by alpha */            ar = *alpha;            ai = alpha[1];            br = cr;            bi = ci;            cr =  br * ar;            ci =  bi * ar;            cr -= bi * ai;            ci += br * ai;/* *          Scale C by beta */            br = *beta;            bi = beta[1];            ar = C[2*i+j*ldc];            ai = C[2*i+j*ldc+1];            C[2*i+j*ldc]   = ar*br - ai * bi;            C[2*i+j*ldc+1] = ai*br + ar * bi;/* *          Store answer back to C */            C[2*i+j*ldc]   += cr;            C[2*i+j*ldc+1] += ci;         }      }      #if csA == 1 && csB == 1         free(aa);         free(bb);      #endif   #endif}int mmtst(void){   char fnam[80];#if defined(LDA) && LDA != 0      const int lda=LDA;#else      const int lda=2*LDA2;#endif#if defined(LDB) && LDB != 0   const int ldb=LDB;#else   const int ldb=2*LDB2;#endif#if defined(LDC) && LDC != 0   const int ldc=LDC;#else   const int ldc=2*LDC2;#endif   int nA, nB;   #ifdef TCPLX      int inca, incb, incc;      const TYPE one=1.0, none=(-1.0);      #if (ALPHA == 1)         TYPE alpha[2] = {1.0, 0.0};      #elif (ALPHA == -1)         TYPE alpha[2] = {-1.0, 0.0};      #else         TYPE alpha[2] = {2.3, 0.0};      #endif      #if (BETA == 1)         TYPE beta[2] = {1.0, 0.0};      #elif (BETA == -1)         TYPE beta[2] = {-1.0, 0.0};      #elif (BETA == 0)         TYPE beta[2] = {0.0, 0.0};      #else         TYPE beta[2] = {1.3, 0.0};      #endif   #else      #ifdef ALPHA         TYPE alpha=ALPHA;      #else         TYPE alpha=1.0;      #endif      #ifdef BETA         TYPE beta=BETA;      #else         TYPE beta=1.0;      #endif   #endif   const TYPE rone=1.0, rnone=(-1.0);   void *va=NULL, *vb=NULL, *vc=NULL;   TYPE *C0, *C1, *A, *B;   TYPE diff, tmp;   int i, j, k, n, nerr;   int M=MB, N=NB, K=KB;   TYPE ErrBound;   if (!M) M = MB0;   if (!N) N = NB0;   if (!K) K = KB0;   #ifdef TREAL      ErrBound = 2.0 * (Mabs(alpha) * 2.0*K*EPS + Mabs(beta) * EPS) + EPS;   #else      diff = Mabs(*alpha) + Mabs(alpha[1]);      tmp = Mabs(*beta) + Mabs(beta[1]);      ErrBound =  2.0 * (diff*8.0*K*EPS + tmp*EPS) + EPS;   #endif   #ifdef NoTransA      nA = K;   #else      nA = M;   #endif   #ifdef NoTransB      nB = N;   #else      nB = K;   #endif   #ifdef TCPLX      inca = lda*nA;      incb = ldb*nB;   #endif   #ifdef ATL_MinMMAlign      va = malloc(ATL_MinMMAlign + lda*nA*ATL_sizeof);      vb = malloc(ATL_MinMMAlign + ldb*nB*ATL_sizeof);      vc = C0 = malloc(2*ldc*N*ATL_sizeof);      assert(va && vb && C0);      A = (TYPE *) ( ( ((size_t) va)/ATL_MinMMAlign ) * ATL_MinMMAlign                     + ATL_MinMMAlign );      B = (TYPE *) ( ( ((size_t) vb)/ATL_MinMMAlign ) * ATL_MinMMAlign                     + ATL_MinMMAlign );   #else      C0 = vc = malloc( (2*ldc*N + lda*nA + ldb*nB) * ATL_sizeof);      assert(vc);      A = C1 + (ldc * N SHIFT);      B = A + (lda * nA SHIFT);   #endif   C1 = C0 + (ldc * N SHIFT);   for (n=lda*nA SHIFT, i=0; i < n; i++) A[i] = dumb_rand();   for (n=ldb*nB SHIFT, i=0; i < n; i++) B[i] = dumb_rand();   for (n=ldc*N SHIFT, i=0; i < n; i++) C0[i] = C1[i] = dumb_rand();   tst_mm(M, N, K, alpha, A, lda, B, ldb, beta, C0, ldc);   NBmm(M, N, K, alpha, A, lda, B, ldb, beta, C1, ldc);   nerr = 0;   for (j=0; j < N; j++)   {      for (i=0; i < M SHIFT; i++)      {         k = i + j*(ldc SHIFT);         diff = C0[k] - C1[k];         if (diff < 0.0) diff = -diff;         if (diff > ErrBound)         {            fprintf(stderr, "C(%d,%d) : expected=%f, got=%f\n",                    i, j, C0[k], C1[k]);            nerr++;         }      }   }   free(vc);   if (va) free(va);   if (vb) free(vb);   return(nerr);}main(){   int ierr;   ierr = mmtst();   if (!ierr) fprintf(stdout, "PASSED TEST\n");   exit(ierr);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?