mvsearch.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 885 行 · 第 1/2 页
C
885 行
int *idN, char *fnamN, char *authN, int *flagN, int *muN, int *nuN, double *mfN,int *idT, char *fnamT, char *authT, int *flagT, int *muT, int *nuT, double *mfT,int *idS, char *fnamS, char *authS, int *flagS, int *muS, int *nuS, double *mfS){ char ln[256]; int i; FILE *fp; double t0; sprintf(ln, "res/%cMVRES", pre); fp = fopen(ln, "r"); assert(fp); assert(fgets(ln, 256, fp)); assert(sscanf(ln, " %d %d %d %d %d %lf %s \"%[^\"]", idN, flagN, muN, nuN, l1mul, mfN, fnamN, authN) == 8); assert(fgets(ln, 256, fp)); assert(sscanf(ln, " %d %d %d %d %d %lf %s \"%[^\"]", idT, flagT, muT, nuT, l1mul, mfT, fnamT, authT) == 8); assert(fgets(ln, 256, fp)); assert(sscanf(ln, " %d %d %d %d %d %lf %s \"%[^\"]", idS, flagS, muS, nuS, &i, mfS, fnamS, authS) == 8); fclose(fp);}void CreateSum (char pre, int l1mul, int idN, char *fnamN, char *authN, int flagN, int muN, int nuN, double mfN, int idT, char *fnamT, char *authT, int flagT, int muT, int nuT, double mfT, int idS, char *fnamS, char *authS, int flagS, int muS, int nuS, double mfS){ char fnam[32]; FILE *fp; sprintf(fnam, "res/%cMVRES", pre); fp = fopen(fnam, "w"); assert(fp); fprintf(fp, "%d %d %d %d %d %.2f %s \"%s\"\n", idN, flagN, muN, nuN, l1mul, mfN, fnamN, authN); fprintf(fp, "%d %d %d %d %d %.2f %s \"%s\"\n", idT, flagT, muT, nuT, l1mul, mfT, fnamT, authT); fprintf(fp, "%d %d %d %d %d %.2f %s \"%s\"\n", idS, flagS, muS, nuS, l1mul, mfS, fnamS, authS); fclose(fp);}void GenMakefile(char pre, char *ccN, char *ccflagsN, char *ccT, char *ccflagsT, char *ccS, char *ccflagsS){ char ln[256]; char renam[128]; char *bet[4] = {"0", "1", "X", "XI0"}; char *tts[6] = {"N", "T", "S", "N", "T"}; char *TAs[6] = {"N", "T", "S", "Nc", "C"}; char *typ, *ct; char UPR; FILE *fp; int i, j, nbet=3, ntran=3; if (pre == 's') typ = "SREAL"; else if (pre == 'd') typ = "DREAL"; else if (pre == 'c') typ = "SCPLX"; else if (pre == 'z') typ = "DCPLX"; else assert(0); UPR = (pre == 's' || pre == 'c') ? 'S' : 'D'; sprintf(ln, "Make_%cmv", pre); fp = fopen(ln, "w"); assert(fp); fprintf(fp, "include Make.inc\n\n"); if (ccN[0] == '\0') fprintf(fp, "MVNCC = $(%cKC)\n", UPR); else fprintf(fp, "MVNCC = %s\n", ccN); if (ccN[0] == '\0' && ccflagsN[0] != '\0') fprintf(fp, "MVNFLAGS = $(CDEFS) $(%cKCFLAGS) %s -D%s\n", UPR, ccflagsN, typ); else if (ccflagsN[0] != '\0') fprintf(fp, "MVNFLAGS = $(CDEFS) %s -D%s\n", ccflagsN, typ); else fprintf(fp, "MVNFLAGS = $(CDEFS) $(%cKCFLAGS) -D%s\n", UPR, typ); if (pre == 'c' || pre == 'z') { fprintf(fp, "MVNcCC = $(MVNCC)\n"); fprintf(fp, "MVNcFLAGS = $(MVNFLAGS) -DConj_\n\n"); } if (ccT[0] == '\0') fprintf(fp, "MVTCC = $(%cKC)\n", UPR); else fprintf(fp, "MVTCC = %s\n", ccT); if (ccT[0] == '\0' && ccflagsT[0] != '\0') fprintf(fp, "MVTFLAGS = $(CDEFS) $(%cKCFLAGS) %s -D%s\n", UPR, ccflagsT, typ); else if (ccflagsT[0] != '\0') fprintf(fp, "MVTFLAGS = $(CDEFS) %s -D%s\n", ccflagsT, typ); else fprintf(fp, "MVTFLAGS = $(CDEFS) $(%cKCFLAGS) -D%s\n", UPR, typ); if (pre == 'c' || pre == 'z') { fprintf(fp, "MVCCC = $(MVTCC)\n"); fprintf(fp, "MVCFLAGS = $(MVTFLAGS) -DConj_\n\n"); } if (ccS[0] == '\0') fprintf(fp, "MVSCC = $(%cKC)\n", UPR); else fprintf(fp, "MVSCC = %s\n", ccS); if (ccS[0] == '\0' && ccflagsS[0] != '\0') fprintf(fp, "MVSFLAGS = $(CDEFS) $(%cKCFLAGS) %s -D%s", UPR, ccflagsS, typ); else if (ccflagsS[0] != '\0') fprintf(fp, "MVSFLAGS = $(CDEFS) %s -D%s", ccflagsS, typ); else fprintf(fp, "MVSFLAGS = $(CDEFS) $(%cKCFLAGS) -D%s", UPR, typ); fprintf(fp, " -DATL_NOL1PREFETCH -DATL_NOL2PREFETCH\n\n"); if (pre == 's' || pre == 'd') { fprintf(fp, "\nobj = "); for (i=0; i < ntran; i++) { fprintf(fp, "\\\n ATL_%cgemv%s_b0.o ATL_%cgemv%s_b1.o ATL_%cgemv%s_bX.o ", pre, TAs[i], pre, TAs[i], pre, TAs[i]); } } else { nbet = 4; ntran = 5; fprintf(fp, "\nobj = "); for (i=0; i < ntran; i++) { fprintf(fp,"\\\n ATL_%cgemv%s_b0.o ATL_%cgemv%s_b1.o ATL_%cgemv%s_bX.o ATL_%cgemv%s_bXI0.o ", pre, TAs[i], pre, TAs[i], pre, TAs[i], pre, TAs[i]); } } fprintf(fp, "\n\n"); fprintf(fp, "%clib : lib\n", pre); fprintf(fp, "lib : %cmvk.grd\n", pre); fprintf(fp, "%cmvk.grd : $(obj)\n", pre); fprintf(fp, "\t$(ARCHIVER) $(ARFLAGS) $(ATLASlib) $(obj)\n"); fprintf(fp, "\t$(RANLIB) $(ATLASlib)\n"); fprintf(fp, "\ttouch %cmvk.grd\n\n", pre); fprintf(fp, "clean :\n\t rm -f $(obj) %cmvk.grd\n", pre); fprintf(fp, "%cclean : clean\n\n", pre); for (j=0; j < ntran; j++) { for (i=0; i < nbet; i++) { if (TAs[j][0] == 'S') { if (i == 3) /* hack to get cap correct without rewriting */ sprintf(renam, " -DATL_%cgemvN_a1_x1_bXi0_y1=ATL_%cgemvS_a1_x1_bXi0_y1 ", pre, pre); else sprintf(renam, " -DATL_%cgemvN_a1_x1_b%s_y1=ATL_%cgemvS_a1_x1_b%s_y1 ", pre, bet[i], pre, bet[i]); fprintf(fp, "ATL_%cgemvS_b%s.o : ATL_%cgemvS.c\n", pre, bet[i], pre); fprintf(fp, "\t$(MVSCC) -o $@ -c $(MVSFLAGS) -DBETA%s -DALPHA1 %s \\\n", bet[i], renam); fprintf(fp, " ATL_%cgemvS.c\n", pre); } else { fprintf(fp, "ATL_%cgemv%s_b%s.o : ATL_%cgemv%s.c\n", pre, TAs[j], bet[i], pre, tts[j]); fprintf(fp,"\t$(MV%sCC) -o $@ -c $(MV%sFLAGS) -DBETA%s -DALPHA1 ATL_%cgemv%s.c\n", TAs[j], TAs[j], bet[i], pre, tts[j]); } } } fclose(fp);}void mvinstall(char pre, int l1mul, int idN, char *fnamN, char *authN, char *ccN, char *ccflagsN, int flagN, int muN, int nuN, int idT, char *fnamT, char *authT, char *ccT, char *ccflagsT, int flagT, int muT, int nuT, int idS, char *fnamS, char *authS, char *ccS, char *ccflagsS, int flagS, int muS, int nuS){ char ln[256]; double mfN, mfT, mfS; GenMakefile(pre, ccN, ccflagsN, ccT, ccflagsT, ccS, ccflagsS); mfS = mvcase(1,pre, fnamS, 'N', flagS, muS, nuS, 5000, ccT, ccflagsT, l1mul); mfN = mvcase(0,pre, fnamN, 'N', flagN, muN, nuN, 5000, ccN, ccflagsN, l1mul); mfT = mvcase(0,pre, fnamT, 'T', flagT, muT, nuT, 5000, ccT, ccflagsT, l1mul); sprintf(ln, "make xemit_head \n"); assert(system(ln) == 0); sprintf(ln, "./xemit_head -p %c -l %d -N -f %d -y %d -x %d -T -f %d -y %d -x %d -S -f %d -y %d -x %d\n", pre, l1mul, flagN, muN, nuN, flagT, muT, nuT, flagS, muS, nuS); fprintf(stderr, "%s", ln); assert(system(ln) == 0); sprintf(ln, "make %cinstall mvNrout=%s mvTrout=%s mvSrout=%s\n", pre, fnamN, fnamT, fnamS); fprintf(stderr, "%s", ln); assert(system(ln) == 0); CreateSum(pre, l1mul, idN, fnamN, authN, flagN, muN, nuN, mfN, idT, fnamT, authT, flagT, muT, nuT, mfT, idS, fnamS, authS, flagS, muS, nuS, mfS);}static int ilcm(const int m, const int n){ int ia, iq, ir, ilcm; if (m == n) return(n); if (m >= n) { ia = m; ilcm = n; } else { ia = n; ilcm = m; } do { iq = ia / ilcm; ir = ia - iq * ilcm; if (ir == 0) return( (m*n)/ilcm ); ia = ilcm; ilcm = ir; } while(1);}int RunSymmCases(char pre, char *fnamT, char *ccT, char *ccflagsT, int muT, int nuT, int flagT, int ncases, int *ids, char **fnams, char **cc, char **ccflags, int *flags, int *mus, int *nus, int *muS, int *nuS){ int i, mu, nu; int imax=(-1); double mf, mfB=0.0; if (ATL_MVIsMM(flagT)) /* if using gemm for trans, use it for notrans too */ { *muS = *nuS = 80; for (i=0; i < ncases; i++) if (ATL_MVIsMM(flags[i])) return(i); assert(0); } for (i=0; i < ncases; i++) { if (ATL_MVIsAxpy(flags[i])) /* only try axpy-based routs */ { mu = ilcm(muT, nus[i]); nu = ilcm(nuT, mus[i]); mf = svcase(pre, ids[i], 75, mu, nu, flags[i], fnams[i], cc[i], ccflags[i], fnamT, ccT, ccflagsT); if (mf > mfB) { mfB = mf; imax = i; *muS = mu; *nuS = nu; } } } assert(imax != -1); return(imax);}void RunCases(char pre){ char fnam[128]; char Nfnam[256], Tfnam[256], Nauth[256], Ncc[256], Tauth[256], Tcc[256]; char Nccflags[512], Tccflags[512]; char Sfnam[256], Sauth[256], Scc[256], Sccflags[512]; char **fnamN, **fnamT, **authN, **authT, **ccN, **ccflagsN, **ccT, **ccflagsT; int i, nNTcases, nTcases, Nbest, Tbest, Sbest; int Nid, Nflag, Nmu, Nnu, Tid, Tflag, Tmu, Tnu; int Sid, Sflag, Smu, Snu; int *flagN, *muN, *nuN, *flagT, *muT, *nuT, *idN, *idT; int l1mul; FILE *fp;/* * Read in cases to try */ sprintf(fnam, "%ccases.dsc", pre); fp = fopen(fnam, "r"); assert(fp); GetCases(fp, &nNTcases, &idN, &fnamN, &authN, &ccN, &ccflagsN, &flagN, &muN, &nuN); GetCases(fp, &nTcases, &idT, &fnamT, &authT, &ccT, &ccflagsT, &flagT, &muT, &nuT); fclose(fp);/* * Try all cases for each trans case */ Nbest = RunTransCases(0, pre, 'N', nNTcases, idN, fnamN, ccN, ccflagsN, flagN, muN, nuN); Tbest = RunTransCases(0, pre, 'T', nTcases, idT, fnamT, ccT, ccflagsT, flagT, muT, nuT); Sbest = RunSymmCases(pre, fnamT[Tbest], ccT[Tbest], ccflagsT[Tbest], muT[Tbest], nuT[Tbest], flagT[Tbest], nNTcases, idN, fnamN, ccN, ccflagsN, flagN, muN, nuN, &Smu, &Snu); Nid = idN[Nbest]; Nflag = flagN[Nbest]; Tflag = flagT[Tbest]; Nmu = muN[Nbest]; Nnu = nuN[Nbest]; strcpy(Nfnam, fnamN[Nbest]); strcpy(Nauth, authN[Nbest]); strcpy(Ncc, ccN[Nbest]); strcpy(Nccflags, ccflagsN[Nbest]); Tid = idT[Tbest]; Tmu = muT[Tbest]; Tnu = nuT[Tbest]; strcpy(Tfnam, fnamT[Tbest]); strcpy(Tauth, authT[Tbest]); strcpy(Tcc, ccT[Tbest]); strcpy(Tccflags, ccflagsT[Tbest]); if (Sbest == -1) Sbest = Nbest; Sid = idN[Sbest]; Sflag = flagN[Sbest]; strcpy(Sfnam, fnamN[Sbest]); strcpy(Sauth, authN[Sbest]); strcpy(Scc, ccN[Sbest]); strcpy(Sccflags, ccflagsN[Sbest]); free(flagN); free(flagT); free(muN); free(muT); free(nuN); free(nuT); for (i=0; i < nNTcases; i++) { free(fnamN[i]); free(authN[i]); free(ccN[i]); free(ccflagsN[i]); } free(fnamN); free(authN); free(ccN); free(ccflagsN); for (i=0; i < nTcases; i++) { free(fnamT[i]); free(authT[i]); free(ccT[i]); free(ccflagsT[i]); } free(fnamT); free(authT); free(ccT); free(ccflagsT); l1mul = FindL1Mul(pre, Tid, Tfnam, Tcc, Tccflags, 'T', Tflag, Tmu, Tnu); Tflag = ConfirmBlock(pre, Tfnam, Tcc, Tccflags, 'T', Tflag, Tmu, Tnu, Tid, l1mul); Nflag = ConfirmBlock(pre, Nfnam, Ncc, Nccflags, 'N', Nflag, Nmu, Nnu, Nid, l1mul); CreateSum(pre, l1mul, Nid, Nfnam, Nauth, Nflag, Nmu, Nnu, -1.0, Tid, Tfnam, Tauth, Tflag, Tmu, Tnu, -1.0, Sid, Sfnam, Sauth, Sflag, Smu, Snu, -1.0);}void GoToTown(pre){ char fnamN[256], authN[256], fnamT[256], authT[256], ln[128]; char ccN[256], ccflagsN[512], ccT[256], ccflagsT[512]; char fnamS[256], authS[256], ccS[256], ccflagsS[512]; int idN, flagN, muN, nuN, idT, flagT, muT, nuT, l1mul; int idS, flagS, muS, nuS, i, j; double mfN, mfT, mfS; sprintf(ln, "res/%cMVRES", pre); if (!FileExists(ln)) RunCases(pre); else /* if default does not pass tester, rerun cases */ { ReadSum(pre, &l1mul, &idN, fnamN, authN, &flagN, &muN, &nuN, &mfN, &idT, fnamT, authT, &flagT, &muT, &nuT, &mfT, &idS, fnamS, authS, &flagS, &muS, &nuS, &mfS); GetIDCase(pre, idN, fnamN, authN, ccN, ccflagsN, &flagN, &muN, &nuN); GetIDCase(pre, idT, fnamT, authT, ccT, ccflagsT, &flagT, &muT, &nuT); GetIDCase(pre, idS, fnamS, authS, ccS, ccflagsS, &flagS, &i, &j); if ( (mvtstcase(pre, 'N', fnamN, ccN, ccflagsN) != 0) || (mvtstcase(pre, 'T', fnamT, ccT, ccflagsT) != 0) || (mvtstcase(pre, 'N', fnamS, ccS, ccflagsS) != 0) ) { assert(remove(ln) == 0); RunCases(pre); } } ReadSum(pre, &l1mul, &idN, fnamN, authN, &flagN, &muN, &nuN, &mfN, &idT, fnamT, authT, &flagT, &muT, &nuT, &mfT, &idS, fnamS, authS, &flagS, &muS, &nuS, &mfS); GetIDCase(pre, idN, fnamN, authN, ccN, ccflagsN, &flagN, &muN, &nuN); GetIDCase(pre, idT, fnamT, authT, ccT, ccflagsT, &flagT, &muT, &nuT); GetIDCase(pre, idS, fnamS, authS, ccS, ccflagsS, &flagS, &i, &j); mvinstall(pre, l1mul, idN, fnamN, authN, ccN, ccflagsN, flagN, muN, nuN, idT, fnamT, authT, ccT, ccflagsT, flagT, muT, nuT, idS, fnamS, authS, ccS, ccflagsS, flagS, muS, nuS);}void PrintUsage(char *fnam){ fprintf(stderr, "USAGE: %s [-p <s,d,c,z>]\n", fnam); exit(-1);}void GetFlags(int nargs, char **args, char *pre, char *TA, int *mu, int *nu){ char ctmp; int i; *pre = 'd'; *mu = *nu = 0; *TA = ' '; for (i=1; i < nargs; i++) { if (args[i][0] != '-') PrintUsage(&args[0][0]); switch(args[i][1]) { case 'p': ctmp = args[++i][0]; ctmp = tolower(ctmp); if (ctmp == 's' || ctmp == 'd' || ctmp == 'c' || ctmp == 'z') *pre = ctmp; else PrintUsage(&args[0][0]); break; case 'm': *mu = atoi(args[++i]); assert(*mu > 0); break; case 'n': *nu = atoi(args[++i]); assert(*nu > 0); break; case 'A': ctmp = args[++i][0]; ctmp = toupper(ctmp); if (ctmp == 'N' || ctmp == 'T') *TA = ctmp; else PrintUsage(args[0]); break; default: fprintf(stderr, "Unknown flag : %s\n", args[i]); PrintUsage(&args[0][0]); } } if (*mu == 0 && *nu) *mu = *nu; else if (*nu == 0 && *mu) *nu = *mu; if ( (*mu || *nu) && *TA == ' ') *TA = 'N';}main(int nargs, char **args){ char pre, TA; int mu, nu; GetFlags(nargs, args, &pre, &TA, &mu, &nu); GoToTown(pre); exit(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?