mvtest.c

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

C
577
字号
              cta, M, N, lda, *beta, beta[1]);   #endif   A = FA_malloc(lda * ATL_MulBySize(nA), FAa, MAa);   X = FA_malloc(ATL_MulBySize(N), FAx, MAx);   Y = FA_malloc(ATL_MulBySize(M), FAy, MAy);   Y0 = FA_malloc(ATL_MulBySize(M), FAy, MAy);   ATL_assert(A && X && Y && Y0);   Mjoin(PATL,gegen)(mA, nA, A, lda, M*N+lda);   Mjoin(PATL,gegen)(N, 1, X, N, N*1139+52);   if ( !SCALAR_IS_ZERO(beta) )   {      Mjoin(PATL,gegen)(M, 1, Y, M, M*8897+112);      Mjoin(PATL,gegen)(M, 1, Y0, M, M*8897+112);   }   if (TA == AtlasNoTrans)   {      if ( SCALAR_IS_ZERO(beta) )         Mjoin(PATL,gemvN_a1_x1_b0_y1)(M, N, alpha, A, lda, X, 1,                                       beta, Y, 1);      else if ( SCALAR_IS_ONE(beta) )         Mjoin(PATL,gemvN_a1_x1_b1_y1)(M, N, alpha, A, lda, X, 1,                                       beta, Y, 1);      #ifdef TCPLX         else if (beta[1] == ATL_rzero)            Mjoin(PATL,gemvN_a1_x1_bXi0_y1)(M, N, alpha, A, lda, X, 1,                                            beta, Y, 1);      #endif      else         Mjoin(PATL,gemvN_a1_x1_bX_y1)(M, N, alpha, A, lda, X, 1,                                       beta, Y, 1);   }   else if (TA == AtlasTrans)   {      if ( SCALAR_IS_ZERO(beta) )         Mjoin(PATL,gemvT_a1_x1_b0_y1)(M, N, alpha, A, lda, X, 1,                                       beta, Y, 1);      else if ( SCALAR_IS_ONE(beta) )         Mjoin(PATL,gemvT_a1_x1_b1_y1)(M, N, alpha, A, lda, X, 1,                                       beta, Y, 1);      #ifdef TCPLX         else if (beta[1] == ATL_rzero)            Mjoin(PATL,gemvT_a1_x1_bXi0_y1)(M, N, alpha, A, lda, X, 1,                                            beta, Y, 1);      #endif      else         Mjoin(PATL,gemvT_a1_x1_bX_y1)(M, N, alpha, A, lda, X, 1,                                       beta, Y, 1);   }   #ifdef TCPLX      else if (TA == AtlasConj)      {         if (beta[1] == ATL_rzero)         {            if (*beta == ATL_rzero)               Mjoin(PATL,gemvNc_a1_x1_b0_y1)(M, N, alpha, A, lda, X, 1,                                              beta, Y, 1);            else if (*beta == ATL_rone)               Mjoin(PATL,gemvNc_a1_x1_b1_y1)(M, N, alpha, A, lda, X, 1,                                              beta, Y, 1);            else               Mjoin(PATL,gemvNc_a1_x1_bXi0_y1)(M, N, alpha, A, lda, X, 1,                                                beta, Y, 1);         }         else Mjoin(PATL,gemvNc_a1_x1_bX_y1)(M, N, alpha, A, lda, X, 1,                                             beta, Y, 1);      }      else if (TA == AtlasConjTrans)      {         if (beta[1] == ATL_rzero)         {            if (*beta == ATL_rzero)               Mjoin(PATL,gemvC_a1_x1_b0_y1)(M, N, alpha, A, lda, X, 1,                                             beta, Y, 1);            else if (*beta == ATL_rone)               Mjoin(PATL,gemvC_a1_x1_b1_y1)(M, N, alpha, A, lda, X, 1,                                             beta, Y, 1);            else               Mjoin(PATL,gemvC_a1_x1_bXi0_y1)(M, N, alpha, A, lda, X, 1,                                               beta, Y, 1);         }         else Mjoin(PATL,gemvC_a1_x1_bX_y1)(M, N, alpha, A, lda, X, 1,                                            beta, Y, 1);      }   #endif   dumb_gemv(TA, M, N, alpha, A, lda, X, beta, Y0);   FA_free(A, FAa, MAa);   FA_free(X, FAx, MAx);   ierr = CheckAns(M, N, beta, Y, Y0);   FA_free(Y, FAy, MAy);   FA_free(Y0, FAy, MAy);   if (ierr) sprintf(ln, "FAILED");   else sprintf(ln, "PASSED");   #ifdef TREAL      fprintf(stdout, "   TEST TA=%c, M=%d, N=%d, lda=%d, beta=%f %s\n",              cta, M, N, lda, beta, ln);   #else      fprintf(stdout, "   TEST TA=%c, M=%d, N=%d, lda=%d, beta=(%f,%f) %s\n",              cta, M, N, lda, *beta, beta[1], ln);   #endif   return(ierr);}int RunTests(enum ATLAS_TRANS TA, int M, int N, int lda, SCALAR beta){   int ierr = 0, i;   #ifdef TREAL      int nbeta = 3, incb = 1;      TYPE betas[3];   #else      int nbeta = 8, incb = 2;      TYPE betas[8];   #endif   #ifdef TREAL      betas[0] = ATL_rzero;      betas[1] = ATL_rone;      betas[2] = beta;   #else      betas[0] = betas[1] = betas[3] = betas[5] = ATL_rzero;      betas[2] = ATL_rone;      betas[4] = betas[6] = *beta;      betas[7] = beta[1];   #endif   for (i=0; i < nbeta; i += incb)   {      if (TA == AtlasNoTrans)      {         ierr = RunTest(AtlasNoTrans, M, N, lda, &betas[i]);         if (ierr) break;         #ifdef TCPLX            ierr = RunTest(AtlasConj, M, N, lda, &betas[i]);            if (ierr) break;         #endif      }      else      {         ierr = RunTest(AtlasTrans, M, N, lda, &betas[i]);         if (ierr) break;         #ifdef TCPLX            ierr = RunTest(AtlasConjTrans, M, N, lda, &betas[i]);            if (ierr) break;         #endif      }   }   return(ierr);}void PrintUsage(char *nam){   fprintf(stderr, "usage: %s -A t/n -m <M> -n <N> -l <lda> -b <betaX>\n", nam);   exit(-1);}void GetFlags(int nargs, char **args, enum ATLAS_TRANS *TA,              int *M0, int *MN, int *incM, int *N0, int *NN, int *incN,              int *lda, TYPE *beta){   int i, k;   char ch;   *TA = AtlasNoTrans;   *M0 = *MN = *incM = 997;   *N0 = *NN = *incN = 177;   *lda = 0;   *beta = 0.8;   #ifdef TCPLX      beta[1] = 0.3;   #endif   for (i=1; i < nargs; i++)   {      if (args[i][0] != '-') PrintUsage(args[0]);      switch(args[i][1])      {      case 'F':         ch = args[i][2];         k = atoi(args[++i]);         if (ch == 'a')         {            if (k < 0)              MAa = -k;            else              FAa = k;         }         else if (args[i][2] == 'y')         {            if (k < 0)              MAy = -k;            else              FAy = k;         }         else         {            if (k < 0)              MAx = -k;            else              FAx = k;         }         break;      case 'A':         i++;         if (args[i][0] == 'N' || args[i][0] == 'n') *TA = AtlasNoTrans;         else if (args[i][0] == 'T' || args[i][0] == 't') *TA = AtlasTrans;         else if (args[i][0] == 'C' || args[i][0] == 'c') *TA = AtlasConjTrans;         else PrintUsage(args[0]);         break;      case 'm':         *M0 = *MN = atoi(args[++i]);         break;      case 'n':         *N0 = *NN = atoi(args[++i]);         break;      case 'M':         *M0 = atoi(args[++i]);         *MN = atoi(args[++i]);         *incM = atoi(args[++i]);         break;      case 'N':         *N0 = atoi(args[++i]);         *NN = atoi(args[++i]);         *incN = atoi(args[++i]);         break;      case 'l':         *lda = atoi(args[++i]);         break;      case 'b':         *beta = atof(args[++i]);         #ifdef TCPLX            beta[1] = atof(args[++i]);         #endif         break;      default:         PrintUsage(args[0]);      }   }   if (*lda == 0)   {      if (*TA == AtlasNoTrans  || *TA == AtlasConj) *lda = -(*M0 + 7);      else *lda = -(*N0 + 7);   }}main(int nargs, char **args)/* * Test the GEMV primitives */{   #ifdef TREAL      TYPE beta;      #define bet &beta   #else      TYPE beta[2];      #define bet beta   #endif   enum ATLAS_TRANS TA;   int M0, MN, incM, N0, NN, incN, m, n, lda, ldagap=0, ierr=0;   GetFlags(nargs, args, &TA, &M0, &MN, &incM,  &N0, &NN, &incN, &lda, bet);   if (lda < 0)   {      lda = -lda;      if (TA == AtlasNoTrans || TA == AtlasConj) ldagap = lda - M0;      else ldagap = lda - N0;      lda -= ldagap;   }   fprintf(stdout, "\n\nBEGINNING GEMV PRIMITIVE TESTING:\n\n");   for (n=N0; n <= NN; n += incN)   {      for (m=M0; m <= MN; m += incM)      {         if (ldagap)         {            if (TA == AtlasNoTrans || TA == AtlasConj) lda = m + ldagap;            else lda = n + ldagap;         }         ierr += RunTests(TA, m, n, lda, beta);      }   }/*   ierr = RunTests(TA, M, N, lda, beta); */   if (ierr == 0) fprintf(stdout, "\n\nGEMV PRIMITIVE PASSED ALL TESTS\n\n");   else fprintf(stdout, "\n\nGEMV PRIMITIVE FAILED SOME TESTS\n\n");   return(ierr);}

⌨️ 快捷键说明

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