int GetUserCase(char pre, int icase, int *iflag, int *mb, int *nb, int *kb, int *ma, int *lat, int *mu, int *nu, int *ku, char *fnam, char *auth, char **MCC, char **MMFLAGS) /* * if icase < 0, go to that line in file; if icase > 0 find that ID in file * return ID of selected line */ { int i, n, ID; char ln[512]; static char sMCC[1024], sMMFLAGS[2048]; FILE *fp; *MCC = *MMFLAGS = NULL; n = NumUserCases(pre); sprintf(ln, "%ccases.dsc", pre); fp = fopen(ln, "r"); if (!fp) return(0); assert(fp); fgets(ln, 256, fp); /* skip comment line */ fgets(ln, 256, fp); /* skip number of cases */ for (i=0; i < n; i++) { if ( fgets(ln, 256, fp) == NULL ) { fclose(fp); return(0); } assert(sscanf(ln, " %d %d %d %d %d %d %d %d %d %d %s \"%[^\"]", &ID, iflag, mb, nb, kb, ma, lat, mu, nu, ku, fnam, auth) == 12); assert(ID > 0); if (i == -icase || ID == icase) { if (LineIsCont(ln)) { assert( fgets(ln, 256, fp) != NULL ); strcpy(sMCC, ln); NoEndLineWhiteSpace(sMCC); assert( fgets(ln, 512, fp) != NULL ); strcpy(sMMFLAGS, ln); NoEndLineWhiteSpace(sMMFLAGS); *MCC = sMCC; *MMFLAGS = sMMFLAGS; } else *MCC = *MMFLAGS = NULL; fclose(fp); return(ID); } if (i != icase && LineIsCont(ln)) { assert( fgets(ln, 256, fp) != NULL ); assert( fgets(ln, 256, fp) != NULL ); } } fclose(fp); return(0); }
MULTHEAD *BuildTable(char pre, enum CLEAN_WHICH which, int nb) /* * Builds table of possible cleanup codes, depending on which: * 0 : pMB * 1 : pNB * 2 : pKB */ { ROUTNODE *rn; int i, n, ID, NB[3]; int iin, io1, io2, iflag, muladd, lat, mu, nu, ku; char *MCC, *MMFLAGS; char rout[ROUTLEN], auth[AUTHLEN]; switch(which) { case CleanM: iin = 0; io1 = 1; io2 = 2; break; case CleanN: iin = 1; io1 = 0; io2 = 2; break; case CleanK: iin = 2; io1 = 0; io2 = 1; break; case CleanNot: exit(-1); } n = NumUserCases(pre); for (i=0; i < n; i++) { rn = NULL; ID = GetUserCase(pre, -i, &iflag, NB, NB+1, NB+2, &muladd, &lat, &mu, &nu, &ku, rout, auth, &MCC, &MMFLAGS); if (ATL_MMNoClean(iflag)) continue; if (NB[io1] < 0 && NB[io1] != -nb) continue; if (NB[io2] < 0 && NB[io2] != -nb) continue; if (NB[io1] && (nb % NB[io1])) continue; if (NB[io2] && (nb % NB[io2])) continue; if (NB[iin] < 0) { if (-NB[iin] < nb) rn = GetRoutNode(-NB[iin], rout, ID, NOTIMED); } else if (NB[iin] == 0) rn = GetRoutNode(1, rout, ID, NOTIMED); else if (NB[iin] < nb) rn = GetRoutNode(NB[iin], rout, ID, NOTIMED); if (rn) rn->fixed = IsCaseFixed(pre, ID, which); } return(imhead); }
int FindBestUser(char pre, int nb0) /* * returns index in <pre>cases.dsc of best user-supplied GEMM, using * a blocking factor as close to nb0 as possible */ { char *MCC, *MMFLAGS; char ln[256], fnam[256]; double mf, mfbest=0.0; int ibest=(-1), i, ncases; int ID, iflag, NB, mb, nb, kb, ma, lat, mu, nu, ku; ncases = NumUserCases(pre); for (i=0; i < ncases; i++) { ID = GetUserCase(pre, -i, &iflag, &mb, &nb, &kb, &ma, &lat, &mu, &nu, &ku, fnam, ln, &MCC, &MMFLAGS); assert(ID > 0); NB = GetUserNB(pre, nb0, mb, nb, kb); if (NB) { mf = ummcase(pre, ID, NB); if (mf > mfbest) { if (utstmmcase(pre, ID, NB)) { /* test kernel before accepting */ ibest = ID; mfbest = mf; } } fprintf(stdout, "%3d. NB=%3d, rout=%40s, MFLOP=%.2f\n", i, NB, fnam, mf); } } return(ibest); }