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 + -
显示快捷键?