mmsearch.c

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

C
2,188
字号
      {        pfA = !pfA;        mfB = mf;      }   }   fclose(fp);   fprintf(stdout, "\n%cNB = %d (%.2f), No copy %cNB = %d (%.2f)\n\n",           pre, nb, mf0, pre, nbB, mfB);   *prefA = pfA;   return(nbB);}void FindNoCopy(char pre){   char ln[128];   int nb, mu, nu, ku, muladd, pfA, lat, FFetch, ifetch, nfetch, i;   double mf;   FILE *fp;   sprintf(ln, "res/%cMMRES", pre);   GetInstLogFile(ln, pre, &muladd, &pfA, &lat, &nb, &mu, &nu, &ku,                  &FFetch, &ifetch, &nfetch, &mf);   nb = CheckUser(pre, 1.02, mf, nb, NULL);   nb = FindNoCopyNB(pre, nb, mu, nu, ku, muladd, &pfA, lat,                     FFetch, ifetch, nfetch);   ku = Mmin(ku, nb);   FindNC0('N', 'N', pre, nb, mu, nu, ku, muladd, pfA, lat,           FFetch, ifetch, nfetch);   FindNC0('N', 'T', pre, nb, mu, nu, ku, muladd, pfA, lat,           FFetch, ifetch, nfetch);   FindNC0('T', 'N', pre, nb, mu, nu, ku, muladd, pfA, lat,           FFetch, ifetch, nfetch);   FindNC0('T', 'T', pre, nb, mu, nu, ku, muladd, pfA, lat,           FFetch, ifetch, nfetch);}void FindCleanupK(char pre, int nb, int mu, int nu, int ku0, int muladd,                  int pfA, int lat0, int FFetch, int ifetch, int nfetch){   char fnam[256];   int genlat, genku, speclat, ku, kumax;   int kb, beta, csC;   double mf, genmf, specmf;   int i, TimeIt=0;   FILE *fp;   i = 1024 / (mu*nu);   for (kumax=4; kumax*kumax < i; kumax += 4);   if (pre == 'd' || pre == 's') kumax *= 2;   if (kumax >= nb) kumax = nb;   else if (kumax > nb/2) kumax = nb/2;   if (ifetch == -1 || nfetch == -1) { ifetch = mu+nu; nfetch = 1; }   if (pre == 's' || pre == 'd')   {      csC = 1;      beta = 1;   }   else   {      csC = 2;      beta = 8;   }   sprintf(fnam, "res/%cCleanK", pre);   if (FileExists(fnam)) /* file already there */   {      fp = fopen(fnam, "r");      assert(fgets(fnam, 256, fp));      assert(fscanf(fp, " %d", &kb) == 1);      fclose(fp);      if (kb > 0 && kb != nb) TimeIt = 1;      sprintf(fnam, "res/%cCleanK", pre);   }   else TimeIt = 1;   if (TimeIt)   {      fp = fopen(fnam, "w");      assert(fp);      fprintf(fp, " KB  MULADD  LAT  PREF NB  MU  NU  KU  FFTCH  IFTCH  NFTCH  GEN-MFLOP  SPC-MFLOP\n");      for (kb = nb; kb; kb--)      {         ku = Mmin(ku0, kb);         sprintf(fnam, "res/%cKB_%d", pre, kb);         speclat = GetGoodLat(muladd, kb, mu, nu, ku, lat0);         specmf = mmcase(fnam, pre, "JIK", 'T', 'N', nb, nb, kb, 0, 0,                         kb, kb, kb, 0, mu, nu, ku, muladd, pfA, speclat, beta,                         1, 1, csC, FFetch, ifetch, nfetch);         sprintf(fnam, "res/%cKB_0_%d", pre, ku);         genlat = GetGoodLat(muladd, 8000, mu, nu, 1, lat0);         genku = Mmin(kumax, ku);         genmf = mmcase(fnam,pre, "JIK", 'T', 'N', nb, nb, kb, 0, 0, 0, 0, 0, 0,                        mu, nu, genku, muladd, pfA, genlat, beta, 1, 1, csC,                        FFetch, ifetch, nfetch);         if (ku != 1)  /* always try ku == 1 for general case */         {            sprintf(fnam, "res/%cKB_0_1", pre);            mf = mmcase(fnam,pre, "JIK", 'T', 'N', nb, nb, kb, 0, 0, 0, 0, 0, 0,                        mu, nu, 1, muladd, pfA, genlat, beta, 1, 1, csC,                        FFetch, ifetch, nfetch);            if (mf > genmf) { genku = 1; genmf = mf; }         }         if (1.01 * genmf > specmf) break;         fprintf(fp,          "%3d  %6d  %3d %4d %3d %3d %3d %3d  %5d  %5d  %5d  %9.2lf  %9.2lf\n",                 kb, muladd, speclat, pfA, nb, mu, nu, ku, FFetch, ifetch,                 nfetch, specmf, genmf);         fflush(fp);      }      fprintf(fp,         "%3d  %6d  %3d %4d %3d %3d %3d %3d  %5d  %5d  %5d  %9.2lf  %9.2lf\n",              0, muladd, genlat, pfA, nb, mu, nu, genku, FFetch, ifetch,              nfetch, specmf, genmf);      fclose(fp);   }}void FindCleanupMN(char pre, char cwh, int nb, int mu, int nu, int ku,                   int muladd, int pfA, int lat,                   int FFetch, int ifetch, int nfetch){   char fnam[128];   int nnb=nb, beta=1, csC=1, TimeIt=0;   int Mb=nb, Nb=nb;   int mu0, nu0, ku0, ma0, lat0, ff0, if0, nf0;   double mf;   FILE *fp;   if (cwh == 'M') Mb = 0;   else Nb = 0;   if (ifetch == -1 || nfetch == -1) { ifetch = mu+nu; nfetch = 1; }   if (pre == 'c' || pre == 'z')   {      beta = 8;      csC = 2;   }   sprintf(fnam, "res/%cClean%c", pre, cwh);   if (FileExists(fnam))   {      GetInstLogFile(fnam, pre, &ma0, &pfA, &lat0, &nnb, &mu0, &nu0, &ku0, &ff0,                     &if0, &nf0, &mf);      if (nnb != nb || mf <= 0.0) TimeIt = 1;   }   else TimeIt = 1;   if (TimeIt)   {      mf = mmcase(NULL, pre, "JIK", 'T', 'N', nb, nb, nb, Mb, Nb, nb, nb, nb, 0,                  mu, nu, ku, muladd, pfA, lat, beta, 1, 1, csC,                  FFetch, ifetch, nfetch);      fp = fopen(fnam, "w");      assert(fp);      PutInstLogFile(fp, muladd, pfA, lat, nb, mu, nu, ku,                     FFetch, ifetch, nfetch, mf);      fclose(fp);   }}typedef struct CleanCase CLEANCASE;struct CleanCase{   double mflop;   CLEANCASE *next;   int imult, icase, fixed, nb, nb0, nb1, nb2;};void PrintCleanCases(CLEANCASE *cp){   for (; cp; cp = cp->next)   {      fprintf(stdout,              "imult=%d, icase=%d, fixed=%d, nb=%d, %d,%d,%d, mflop=%.2f\n",              cp->imult, cp->icase, cp->fixed, cp->nb, cp->nb0, cp->nb1,              cp->nb2, cp->mflop);   }   fprintf(stdout, "\n");}CLEANCASE *GetUserCleanup(char pre, int nb, enum CW which)/* * Read in user clean file */{   FILE *fp;   CLEANCASE *cp, *cp0;   int i, n;   char cwh[3] = {'M', 'N', 'K'};   char ln[128];   sprintf(ln, "res/%cuClean%c", pre, cwh[which]);   if (!FileExists(ln))   {      sprintf(ln, "make RunUMMClean pre=%c nb=%d which=%c\n",              pre, nb, tolower(cwh[which]));      assert(system(ln) == 0);      sprintf(ln, "res/%cuClean%c", pre, cwh[which]);   }   fp = fopen(ln, "r");   assert(fp);   assert(fgets(ln, 128, fp));   assert(fgets(ln, 128, fp));   sscanf(ln, " %d", &n);   if (n < 1) return(NULL);   cp0 = cp = malloc(sizeof(CLEANCASE));   assert(cp0);   for (i=0; i < n; i++)   {      assert(fgets(ln, 128, fp));      sscanf(ln, " %d %d %d %d %d %d %d %lf", &cp->imult, &cp->icase,&cp->fixed,             &cp->nb, &cp->nb0, &cp->nb1, &cp->nb2, &cp->mflop);      if (i != n-1)      {         cp->next = malloc(sizeof(CLEANCASE));         assert(cp->next);         cp = cp->next;      }      else cp->next = NULL;   }   fclose(fp);   return(cp0);}int *GetKBs(char pre, int nb)/* * returns nb+1 length vector, KB[i] is KB & lda of KB Cleanup; 0 means var */{   FILE *fp;   int k, *KB;   char ln[128];   sprintf(ln, "res/%cCleanK", pre);   fp = fopen(ln, "r");   assert(fp);   assert(fgets(ln, 128, fp));  /* skip titles */   KB = malloc((nb+1)*sizeof(int));   assert(KB);   for (k=nb; k; k--)   {      if (fgets(ln, 128, fp)) { assert(sscanf(ln, " %d", KB+k)==1); }      else break;   }   for(; k; k--) KB[k] = 0;   return(KB);}double RebuttUserKCase(char pre, int nb, int mu, int nu, int ku, int ma,                       int pfA, int lat, int FF, int iff, int nf, int *KBs,                       int *NBs){   double mf, mf0=0.0;   int K, csC, i, ld, iku, ilat;   if (pre == 'c' || pre == 'z') csC = 2;   else csC = 1;   for(i=0; i < 3 && NBs[i]; i++)   {      K = NBs[i];      ld = KBs[K];      iku = Mmin(ku, K);      ilat = GetGoodLat(ma, K, mu, nu, 1, lat);      mf = mmclean(pre, CleanK, "JIK", 'T', 'N', nb, nb, K,                   nb, nb, ld, ld, ld, 0,                   mu, nu, iku, ma, pfA, ilat, 1, 1, 1, csC, FF, iff, nf);      fprintf(stdout, "   CleanK: %dx%dx%d : %.2f\n", nb, nb, K, mf);      assert(mf > 0.0);      mf0 += mf;   }   return(mf0 / i);}CLEANCASE *RebuttUserKClean(char pre, int nb, int mu, int nu, int ku,                            int muladd, int pfA,  int lat,                            int FF, int iff, int nf){   double gmf, umf;   int NB[3], *KBs;   CLEANCASE *cp0, *cp;   KBs = GetKBs(pre, nb);   cp0 = GetUserCleanup(pre, nb, CleanK);   for (cp=cp0; cp; cp = cp->next)   {      NB[0] = cp->nb0; NB[1] = cp->nb1; NB[2] = cp->nb2;      gmf = RebuttUserKCase(pre, nb, mu, nu, ku, muladd, pfA, lat, FF, iff, nf,                            KBs, NB);      fprintf(stdout, "   pKBmm_%d: user=%.2f  generated=%.2f\n",              cp->imult, cp->mflop, gmf);      if (1.02*gmf > cp->mflop) cp->icase = -1;   }   free(KBs);   return(cp0);}double RebuttUserCase(char pre, int nb, enum CW which, int mu, int nu, int ku,                      int ma, int pfA, int lat, int FF, int iff, int nf,                      int *NBs){   double mf, mf0=0.0;   int NB[3], M[3], NU[3], csC, i, j, NUmax, ilat;   char cwh[3] = {'M', 'N', 'K'};   if (pre == 'c' || pre == 'z') csC = 2;   else csC = 1;   NB[0] = NB[1] = NB[2] = M[0] = M[1] = M[2] = nb;   NB[which] = 0;   NU[0] = mu; NU[1] = nu; NU[2] = ku;   NUmax = NU[which];   for(i=0; i < 3 && NBs[i]; i++)   {      j = M[which] = NBs[i];      NU[which] = Mmin(j, NUmax);      ilat = GetGoodLat(ma, M[2], NU[0], NU[1], NU[2], lat);      mf = mmclean(pre, which, "JIK", 'T', 'N', M[0], M[1], M[2],                   NB[0], NB[1], NB[2], nb, nb, 0,                   mu, nu, ku, ma, pfA, lat, 1, 1, 1, csC, FF, iff, nf);      fprintf(stdout, "   Clean%c: %dx%dx%d : %.2f\n", cwh[which],              M[0], M[1], M[2], mf);      assert(mf > 0.0);      mf0 += mf;   }   return(mf0 / i);}CLEANCASE *RebuttUserCases(char pre, int nb, enum CW which,                           int mu, int nu, int ku, int muladd, int pfA, int lat,                           int FF, int iff, int nf){   double gmf, umf;   int NB[3];   CLEANCASE *cp0, *cp;   char cwh[3] = {'M', 'N', 'K'};   if (which == CleanK)      return(RebuttUserKClean(pre, nb, mu, nu, ku, muladd, pfA, lat,                              FF, iff, nf));   cp0 = GetUserCleanup(pre, nb, which);   for (cp=cp0; cp; cp = cp->next)   {      NB[0] = cp->nb0; NB[1] = cp->nb1; NB[2] = cp->nb2;      gmf = RebuttUserCase(pre, nb, which, mu, nu, ku, muladd, pfA, lat,                           FF, iff, nf, NB);      fprintf(stdout, "   p%cBmm_%d: user=%.2f  generated=%.2f\n",              cwh[which], cp->imult, cp->mflop, gmf);      if (1.02*gmf > cp->mflop) cp->icase = -1;   }   return(cp0);}CLEANCASE *WeedOutLosers(CLEANCASE *cp0){   CLEANCASE *cp, *cp1;   while(cp0 && cp0->icase == -1)   {      cp = cp0->next;      free(cp0);      cp0 = cp;   }   if (cp0 && cp0->next)   {      for (cp=cp0; cp->next; cp = cp->next)      {         cp1 = cp->next;         if (cp1->icase == -1)         {            cp->next = cp1->next;            free(cp1);            if (cp->next == NULL) break;         }      }   }   return(cp0);}void KillAllCleans(CLEANCASE *cp){   CLEANCASE *cp1;   while (cp)   {      cp1 = cp->next;      free(cp);      cp = cp1;   }}int NumUserCleans(CLEANCASE *cp){   int i;   for (i=0; cp; cp = cp->next) if (cp->icase != -1) i++;   return(i);}void FindUserCleanup(char pre, int nb, enum CW which, int mu, int nu, int ku,                     int ma, int pfA, int lat, int FF, int iff, int nf){   CLEANCASE *cp, *cp0;   FILE *fp;   char ln[128];   char cwh[3] = {'M', 'N', 'K'};   sprintf(ln, "res/%cuClean%cF", pre, cwh[which]);   if (FileExists(ln)) return;/* already done */   cp = RebuttUserCases(pre, nb, which, mu, nu, ku, ma, pfA, lat, FF, iff, nf);   cp = WeedOutLosers(cp);   fp = fopen (ln, "w");   assert(fp);   fprintf(fp, "MULT  ICASE  FIXED  NB\n");   fprintf(fp, "%d\n", NumUserCleans(cp));   for(cp0=cp; cp; cp = cp->next)      fprintf(fp, "%4d  %5d  %5d %3d\n",              cp->imult, cp->icase, cp->fixed, cp->nb);   fclose(fp);   KillAllCleans(cp0);}void FindAllUserClean(char pre, int nb, int mu, int nu, int ku,                      int ma, int pfA, int lat, int FF, int iff, int nf){   FindUserCleanup(pre, nb, CleanM, mu, nu, ku, ma, pfA, lat, FF, iff, nf);   FindUserCleanup(pre, nb, CleanN, mu, nu, ku, ma, pfA, lat, FF, iff, nf);   FindUserCleanup(pre, nb, CleanK, mu, nu, ku, ma, pfA, lat, FF, iff, nf);}void FindAllUserClean0(char pre){   double mf;   int nb, mu, nu, ku, muladd, lat, FF, iff, nf, pfA;   char ln[64];   sprintf(ln, "res/%cMMRES", pre);   GetInstLogFile(ln, pre, &muladd, &pfA, &lat, &nb, &mu, &nu, &ku, &FF,                     &iff, &nf, &mf);   nb = CheckUser(pre, 1.02, mf, nb, NULL);   FindAllUserClean(pre, nb, mu, n

⌨️ 快捷键说明

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