getsyssum.c

来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 171 行

C
171
字号
/* *             Automatically Tuned Linear Algebra Software v3.8.0 *                    (C) Copyright 1997 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *   1. Redistributions of source code must retain the above copyright *      notice, this list of conditions and the following disclaimer. *   2. Redistributions in binary form must reproduce the above copyright *      notice, this list of conditions, and the following disclaimer in the *      documentation and/or other materials provided with the distribution. *   3. The name of the ATLAS group or the names of its contributers may *      not be used to endorse or promote products derived from this *      software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <assert.h>#include "atlas_type.h"#include "atlas_fopen.h"int GetL1CacheSize(int MaxL1Size){   FILE *L1f;   char ln[80];   int L1Size;   if (!FileExists("res/L1CacheSize"))   {      sprintf(ln, "make RunL1 MaxL1=%d\n",MaxL1Size);      assert(system(ln) == 0);   }   L1f = fopen("res/L1CacheSize", "r");   assert(L1f != NULL);   fscanf(L1f, "%d", &L1Size);   fclose(L1f);   fprintf(stderr, "\n      Read in L1 Cache size as = %dKB.\n",L1Size);   return(L1Size);}void getfpinfo0(char pre, int *muladd, int *lat, int *lbnreg, double *mf){   char fnam[128];   FILE *fp;   if (pre == 'z') pre = 'd';   else if (pre == 'c') pre = 's';   sprintf(fnam, "res/%cMULADD", pre);   if (!FileExists(fnam))   {      sprintf(fnam, "make res/%cMULADD pre=%c\n", pre, pre);      assert(system(fnam) == 0);      sprintf(fnam, "res/%cMULADD", pre);   }   fp = fopen(fnam, "r");   assert(fp);   assert(fscanf(fp, " %d", muladd) == 1);   assert(fscanf(fp, " %d", lat) == 1);   assert(fscanf(fp, " %lf", mf) == 1);   assert(fscanf(fp, " %d", lbnreg) == 1);   fclose(fp);}void getfpinfo(char pre, int *muladd, int *lat, int *lbnreg, int *nkflop){   double mf;   char ln[32];   getfpinfo0(pre, muladd, lat, lbnreg, &mf);   if (mf <= 0.0)   {      if (pre == 'c') pre = 's';      else if (pre == 'z') pre = 'd';      sprintf(ln, "make RunMADef pre=%c\n", pre);      assert(system(ln) == 0);      getfpinfo0(pre, muladd, lat, lbnreg, &mf);      assert(mf >= 0.0);   }   mf = mf * 0.75 * 750;   #ifdef ATL_ARCH_ATHLON  /* kludge for athlon defaults */      mf *= 3.0;   #endif   if (mf > (double)(1<<30)) *nkflop = ~(1<<31);   else *nkflop = mf;}void CreateHeader(char pre, char *fnam, int L1Size, int muladd, int lat,                  int lbnreg, int nkflop, int mmnreg){   FILE *fpout;   fpout = fopen(fnam, "w");   assert(fpout);   fprintf(fpout, "#ifndef ATL_%cSYSINFO_H\n   #define ATL_%cSYSINFO_H\n\n",           toupper(pre), toupper(pre));   if (muladd) fprintf(fpout, "#define ATL_MULADD\n");   else fprintf(fpout, "#define ATL_NOMULADD\n");   fprintf(fpout, "#define ATL_L1elts %d\n", L1Size);   fprintf(fpout, "#define ATL_fplat  %d\n", lat);   fprintf(fpout, "#define ATL_lbnreg %d\n", lbnreg);   fprintf(fpout, "#define ATL_mmnreg %d\n", mmnreg);   fprintf(fpout, "#define ATL_nkflop %d\n", nkflop);   fprintf(fpout, "\n#endif\n");   fclose(fpout);}int getmmnreg(char pre){   char fnam[128];   int mmnregs;   FILE *fp;   if (pre == 'z') pre = 'd';   else if (pre == 'c') pre = 's';   sprintf(fnam, "res/%cnreg", pre);   if (!FileExists(fnam))   {      sprintf(fnam, "make res/%cnreg\n", pre);      assert(system(fnam) == 0);      sprintf(fnam, "res/%cnreg", pre);   }   fp = fopen(fnam, "r");   assert(fp);   fscanf(fp, " %d", &mmnregs);   fclose(fp);   return(mmnregs);}main(int nargs, char **args){   int MaxL1Size;   int muladd, lat, lbnreg, L1Size, mmnreg, nkflop;   FILE *fpout;   char pre;   if (nargs != 3)   {      fprintf(stderr, "USAGE: %s <pre> <file>\n", args[0]);      exit(-1);   }   pre = *args[1];   L1Size = 1024 * GetL1CacheSize(64);   if (pre == 'd') L1Size /= ATL_dsize;   else if (pre == 's') L1Size /= ATL_ssize;   else if (pre == 'z') L1Size /= ATL_csize;   else if (pre == 'c') L1Size /= ATL_zsize;   getfpinfo(pre, &muladd, &lat, &lbnreg, &nkflop);   CreateHeader(pre, args[2], L1Size, muladd, lat, lbnreg, nkflop, 0);   mmnreg = getmmnreg(pre);   CreateHeader(pre, args[2], L1Size, muladd, lat, lbnreg, nkflop, mmnreg);   exit(0);}

⌨️ 快捷键说明

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