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