[Math-atlas-commits] CVS: AtlasBase/Clint atlas.base,1.176,1.177
Brought to you by:
rwhaley,
tonyc040457
From: R. C. W. <rw...@us...> - 2009-09-28 16:26:57
|
Update of /cvsroot/math-atlas/AtlasBase/Clint In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv12085/Clint Modified Files: atlas.base Log Message: Index: atlas.base =================================================================== RCS file: /cvsroot/math-atlas/AtlasBase/Clint/atlas.base,v retrieving revision 1.176 retrieving revision 1.177 diff -C2 -d -r1.176 -r1.177 *** atlas.base 26 Sep 2009 16:58:32 -0000 1.176 --- atlas.base 28 Sep 2009 16:26:43 -0000 1.177 *************** *** 2102,2105 **** --- 2102,2233 ---- } + @beginskip + /* + * This not very useful since emit_mm creates only 1 beta at a time. + * We will gen and time using old-school way + */ + char *GetEmitMMGenStr(char pre, ATL_mmnode_t *mmp) + /* + * RETURNS: free-able string containing the line to make xemit_mm generate + * the kernel described in mmp. + * NOTE: Assumes xemit_mm already build by makefile dependency. + * NOTE: if fnam is NULL or empty, then no output redirect is added + * (assumed added later). + */ + { + char ln[2048]; + int i; + + i = sprintf(ln, "./xemit_mm -p %c -l %d -M %d -N %d -K %d ", pre, + mmp->lat, mmp->mbB, mmp->nbB, mmp->kbB); + i += sprintf(ln+i, "-m %d -n %d -k %d -F0 %d -FN %d -FF %d ", + mmp->mu, mmp->nu, mmp->ku, mmp->iftch, mmp->nftch, mmp->fftch); + i += sprintf(ln+i, "-csA 1 -csB 1 -csC %d ", + (pre == 'c' || pre == 'z') ? 2 : 1); + sprin + -csA 1 -csB 1 + } + @endskip + + void TimeAllGennedKernels + ( + char pre, /* type/precision prefix */ + int itime, /* which entry in mflop to overwrite */ + int FORCE, /* 1: do not accept answer from pre-existing files */ + ATL_mmnode_t *mmb /* base ptr to list matmul nodes */ + ) + /* + * Searches through list of matmul kernels, and times any generated ones + * with the given parameters (ID < 0 means generated file) + */ + { + ATL_mmnode_t *mp; + for (mp = mmb; mp; mp = mp->next) + { + if (mp->ID < 0) + { + if (FORCE) + assert(!system("rm -f res/GENOUT\n")); + + mp->mflop[itime] = mmcase(FORCE ? "res/GENOUT" : NULL, pre, + FLAG_IS_SET(mp->flag, MMF_AOUTER) ? "IJK" : "JIK", + mp->TA == AtlasTrans ? 'T' : 'N', mp->TB == AtlasTrans ? 'T' : 'N', + mp->mbB, mp->nbB, mp->kbB, mp->mbB, mp->nbB, mp->kbB, + mp->kbB, mp->kbB, 0, mp->mu, mp->nu, mp->ku, mp->muladd, mp->pref, + mp->lat, 1, 1, 1, (pre == 'c' || pre == 'z') ? 2 : 1, + mp->fftch, mp->iftch, mp->nftch); + } + } + } + + ATL_mmnode_t *GetOrTransMMRES(char pre) + /* + * Reads pre-existing file <pre>MMRES.sum, or creates it by translating + * old-style <pre>MMRES. If neither file exists, returns NULL + * NOTE: does not read user-contrib case from this file, since that has + * been superceded by <pre>eMMRES.sum + * RETURNS: list of two kernels. First is generated kernel from MMRES.sum or + * MMRES, 2nd is best user-contrib from MMRES.sum or eMMRES.sum. + */ + { + char ln[1024]; + ATL_mmnode_t *mmb; + + sprintf(ln, "%cMMRES.sum", pre); + mmb = ReadMMFile(ln); + /* + * If file does not exist, see if there is an old-style MMRES that we can + * translate + */ + if (!mmb) + { + mmb = GetMMNode(); + ln[6] = '\0'; /* ln = <pre>MMRES */ + if (FileExists(ln)) + { + GetInstLogFile(ln, pre, &mmb->muladd, &mmb->pref, &mmb->lat, &mmb->nbB, + &mmb->mu, &mmb->nu, &mmb->ku, &mmb->fftch, &mmb->iftch, + &mmb->nftch, mmb->mflop); + mmb->ID = -1; + mmb->TA = AtlasTrans; + mmb->TB = AtlasNoTrans; + mmb->mbB = mmb->kbB = mmb->nbB; + if (mmb->ku > (mmb->kbB>>1)) + mmb->ku = mmb->kbB; + if (mmb->ku == mmb->kbB) + mmb->kbmin = mmb->kbmax = mmb->ku; + else + { + mmb->kbmin = mmb->ku; + mmb->kbmax = ((4000)/mmb->ku)*mmb->ku; + SET_FLAG(mmb->flag, MMF_KRUNTIME, 1); + } + if (mmb->mflop[0] <= 0.0) /* time kernels if necessary */ + TimeAllGennedKernels(pre, 0, 0, mmb); + /* + * Get best contrib kernel; if eMMRES does not exist, search to create it + * if it exists but has bad MFLOP values, retime and rewrite it + */ + sprintf(ln, "%ceMMRES.sum", pre); + mmb->next = ReadMMFile(ln); + if (!mmb->next) + { + sprintf(ln, "make RunUMMSearch pre=%c nb=%d\n", pre, mmb->nbB); + assert(!system(ln)); + mmb->next = ReadMMFile(ln); + assert(mmb->next); + if (mmb->next->mflop[0] <= 0.0) + { + TimeAllMMKernels(0, 1, 1, mmb->next, pre, 0, 0, 0, 1, 0, 0); + WriteMMFile(ln, mmb->next); + } + } + } + else + mmb = KillMMNode(mmb); + } + return(mmb); + } + void mmsearch(char pre, int MULADD, int Fku, int nNBs, int *NBs, int nreg, int LAT, int Fnb) |