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