rotsrch.c

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

C
1,193
字号
      "%s      X += ((N-1)SHIFT)*incX;\n", spc);   fprintf(fpout,      "%s      Y += ((N-1)SHIFT)*incY;\n", spc);   fprintf(fpout,      "%s   }\n", spc);   fprintf(fpout,      "%s   else if (incX != 1 || incY == -1)\n", spc);   fprintf(fpout,      "%s   {\n", spc);   fprintf(fpout,      "%s      incy = -incY;\n", spc);   fprintf(fpout,      "%s      Y += ((N-1)SHIFT)*incY;\n", spc);   fprintf(fpout,      "%s      incx = -incX;\n", spc);   fprintf(fpout,      "%s      X += ((N-1)SHIFT)*incX;\n", spc);   fprintf(fpout,      "%s   }\n", spc);   fprintf(fpout,      "%s}\n", spc);   fprintf(fpout,      "%selse if (incX == -1 && incY != 1)\n", spc);   fprintf(fpout,      "%s{\n", spc);   fprintf(fpout,      "%s   incx = 1;\n", spc);   fprintf(fpout,      "%s   X -= ((N-1)SHIFT);\n", spc);   fprintf(fpout,      "%s   incy = -incY;\n", spc);   fprintf(fpout,      "%s   Y += ((N-1)SHIFT)*incY;\n", spc);   fprintf(fpout,      "%s}\n", spc);   fprintf(fpout,      "%selse if (!incX || !incY) return;\n", spc);   fprintf(fpout, "L1:\n");}void GenMakefile(char pre, int n, int *ix, int *iy, int *ia, int *ib,                 FILENODE **bp){   char *cc, *ccflags, *nam, *typ="";   char ln[32];   char *rout = "rot";   int i;   FILE *fpout;   sprintf(ln, "GEN/Make_%c%s", pre, rout);   fpout = fopen(ln, "w");   assert(fpout);   if (pre == 's') typ="SREAL";   else if (pre == 'd') typ="DREAL";   else if (pre == 'c') typ="SCPLX";   else if (pre == 'z') typ="DCPLX";   fprintf(fpout, "include Make.inc\n\n");   fprintf(fpout, "obj = ATL_%c%s.o", pre, rout);   for (i=0; i < n; i++)      fprintf(fpout, " %s.o", GetNam(pre, ia[i], ib[i], ix[i], iy[i]));   fprintf(fpout, "\n\n");   fprintf(fpout, "all : lib\n%clib : lib\nlib : %c%s.grd\n\n", pre, pre, rout);   fprintf(fpout, "%c%s.grd : $(obj)\n", pre, rout);   fprintf(fpout, "\t$(ARCHIVER) $(ARFLAGS) $(ATLASlib) $(obj)\n");   fprintf(fpout, "\t$(RANLIB) $(ATLASlib)\n");   fprintf(fpout, "\ttouch %c%s.grd\n", pre, rout);   fprintf(fpout, "\n");   sprintf(ln, "ATL_%c%s", pre, rout);   fprintf(fpout, "%s.o : %s.c\n", ln, ln);   fprintf(fpout, "\t$(ICC) $(ICCFLAGS) -D%s -o $@ -c %s.c\n", typ, ln);   for (i=0; i < n; i++)   {      nam = GetNam(pre, ia[i], ib[i], ix[i], iy[i]);      cc = bp[i]->cc;      ccflags = bp[i]->ccflags;      if (!cc) cc = (pre == 's' || pre == 'c') ? "$(SKC)" : "$(DKC)";      if (!ccflags)         ccflags = (pre == 's' || pre == 'c') ? "$(SKCFLAGS)":"$(DKCFLAGS)";      fprintf(fpout, "%s.o : %s.c\n", nam, nam);      fprintf(fpout, "\t%s %s $(CDEFS) -D%s -o $@ -c %s.c\n",              cc, ccflags, typ, nam);   }   fclose(fpout);}void GenMainRout(char pre, int n, int *ix, int *iy, int *ia, int *ib,                 FILENODE **bp){   int i, j, NeedElse=0;   FILENODE *gp;   FILE *fpout;   char *els="else if", *ifs ="if";   char *spcs="                  ";   char *spc = spcs+18;   char ln[64];   char *dargs="const int, TYPE*, const int, TYPE*, const int, const TYPE, const TYPE";   char *args="N, X, incx, Y, incy, alpha, beta";   sprintf(ln, "GEN/ATL_%crot.c", pre);   fpout = fopen(ln, "w");   assert(fpout);   fprintf(fpout, "#include \"atlas_misc.h\"\n\n");   gp = FindGen(n, ix, iy, ia, ib, bp);   assert(gp);/* * prototype all routines */   for (i=0; i < n; i++)   {      fprintf(fpout, "void %s\n   (%s);\n",              GetNam(pre, ia[i], ib[i], ix[i], iy[i]), dargs);   }   if (pre == 'c' || pre == 'z')      fprintf(fpout, "void Mjoin(PATLU,rot)\n   (const int, TYPE*, const int, TYPE*, const int, const TYPE, const TYPE);\n");   if (pre == 'z') fprintf(fpout, "void ATL_zdrot");   else if (pre == 'c') fprintf(fpout, "void ATL_csrot");   else  fprintf(fpout, "void ATL_%crot", pre);   fprintf(fpout,           "(const int N, TYPE *X, const int incX, TYPE *Y, const int incY,\n");   fprintf(fpout, "              const TYPE alpha, const TYPE beta)\n{\n");   fprintf(fpout, "   int incx=incX, incy=incY;\n");   fprintf(fpout, "\n   if ((N > 0) && ((alpha != ATL_rone) || (beta != ATL_rzero)) )\n   {\n");   spc -= 6;   MangleIncs(fpout, spc, pre);   GenAlpBetCase(pre, spc, fpout, n, ix, iy, ia, ib);   if (pre == 'c' || pre == 'z')   {      fprintf(fpout,         "%sif (incx==1 && incy==1)\n", spc);      fprintf(fpout,         "%s{\n", spc);      fprintf(fpout,         "%s   Mjoin(PATLU,rot)(N+N, X, 1, Y, 1, alpha, beta);\n", spc);      fprintf(fpout,         "%s   return;\n", spc);      fprintf(fpout,         "%s}\n", spc);   }/* * Handle general alpha & beta, specific incs */   fprintf(fpout, "\n");   for (i=0; i < n-1; i++)   {      if (ia[i] != AlphaX || ib[i] != AlphaX) continue;      if (ix[i] && iy[i])         fprintf(fpout, "%s%s (incx == %d && incy == %d)\n",                 spc, ifs, ix[i], iy[i]);      else if (iy[i]) fprintf(fpout, "%s%s (incy == %d)\n", spc, ifs, iy[i]);      else if (ix[i]) fprintf(fpout, "%s%s (incx == %d)\n", spc, ifs, ix[i]);      fprintf(fpout, "%s   %s(%s);\n", spc,              GetNam(pre, ia[i], ib[i], ix[i], iy[i]), args);      ifs = els;      NeedElse = 1;   }   if (NeedElse)   {      fprintf(fpout, "%selse\n", spc);      spc -= 3;   }   fprintf(fpout, "%s%s(%s);\n", spc,           GetNam(pre, AlphaX, AlphaX, 0, 0), args);   fprintf(fpout, "   }\n");   fprintf(fpout, "}\n");   fclose(fpout);}void DumpFile(char *fnam, FILE *fpout){   FILE *fpin;   char ln[512];   sprintf(ln, "ROT/%s", fnam);   fpin = fopen(ln, "r");   assert(fpin);   while(fgets(ln, 512, fpin)) fputs(ln, fpout);   fclose(fpin);}void GenFiles(char pre, int n, int *ix, int *iy, int *ia, int *ib,              FILENODE **bp)/* * Generates all needed files */{   int i;   char *nam, *typ;   char ln[128];   FILE *fpout;   GenMainRout(pre, n, ix, iy, ia, ib, bp);   GenMakefile(pre, n, ix, iy, ia, ib, bp);   for (i=0; i < n; i++)   {      nam = GetNam(pre, ia[i], ib[i], ix[i], iy[i]);      sprintf(ln, "GEN/%s.c", nam);      fpout = fopen(ln, "w");      assert(fpout);      fprintf(fpout, "#define ATL_UROT %s\n\n", nam);      DumpFile(bp[i]->rout, fpout);      fclose(fpout);   }}void CreateSumm(char pre, int n, int *ix, int *iy, int *ia, int *ib,                FILENODE **bp)/* * Creates summary file of form:<ncases><ID> <alpha> <beta> <incX> <incY> <rout> <auth> */{   int i;   char ln[64];   FILE *fpout;   sprintf(ln, "res/%cROT_SUMM", pre);   fpout = fopen(ln, "w");   assert(fpout);   fprintf(fpout, "%d\n", n);   for (i=0; i < n; i++)   {      fprintf(fpout, "%3d %3d %3d %3d %3d %s \"%s\"\n",              bp[i]->ID, ia[i], ib[i], ix[i], iy[i], bp[i]->rout, bp[i]->auth);   }   fclose(fpout);}void AssBest(FILENODE *fbase, int n, int *id, FILENODE **bp)/* * Associates best file pointers with filenodes based on ID */{   int i, ID;   FILENODE *fp;   for (i=0; i < n; i++)   {      ID = id[i];      for (fp=fbase; fp; fp = fp->next) if (fp->ID == ID) break;      assert(fp);      bp[i] = fp;   }}FILENODE *GetSumm(char pre, int *N, int **IX, int **IY, int **IA,  int **IB,                  FILENODE ***BP){   FILENODE *fbase, **bp;   int i, n, *ix, *iy, *ia, *ib, *id;   char ln[512];   FILE *fpin;   *N = 0;   sprintf(ln, "res/%cROT_SUMM", pre);   fpin = fopen(ln, "r");   if (fpin == NULL) return(NULL);   fbase = ReadFile(pre);   assert( fgets(ln, 512, fpin) != NULL );   sscanf(ln, " %d", &n);   assert(n > 0);   ix = malloc(5*n*sizeof(int));   assert(ix);   iy = ix + n;   ia = iy + n;   ib = ia + n;   id = ib + n;   bp = malloc(n*sizeof(FILENODE*));   assert(bp);   for (i=0; i < n; i++)   {      assert( fgets(ln, 512, fpin) != NULL );      assert(sscanf(ln, " %d %d %d %d %d", id+i, ia+i, ib+i, ix+i, iy+i) == 5);      bp[i] = NULL;   }   fclose(fpin);   AssBest(fbase, n, id, bp);   *N = n;   *IX = ix;   *IY = iy;   *IA = ia;   *IB = ib;   *BP = bp;   return(fbase);}void DoIt(char pre){   FILENODE *fbase, **bp;   int n;   int *ix, *iy, *ia, *ib;   fbase = ReadFile(pre);   fbase = TstFile(pre, fbase, &n);  /* get rid of nodes that don't work */   ix = malloc(4*n*sizeof(int));   assert(ix);   bp = malloc(n*sizeof(FILENODE*));   assert(bp);   iy = ix + n;   ia = iy + n;   ib = ia + n;   n = GetCombos(fbase, ix, iy, ia, ib, bp);   BruteTime(pre, n, fbase, ix, iy, ia, ib, bp);   n = KillSpecCases(n, ix, iy, ia, ib, bp);   fprintf(stdout, "%d:\n", __LINE__);   PrintTable(n, ix, iy, ia, ib, bp);   SortCases(n, ix, iy, ia, ib, bp);   fprintf(stdout, "%d:\n", __LINE__);   PrintTable(n, ix, iy, ia, ib, bp);   CreateSumm(pre, n, ix, iy, ia, ib, bp);   KillAllFN(fbase);   free(bp);   free(ix);}void GoToTown(char pre){   FILENODE *fptr, **bp;   int n, *ix, *iy, *ia, *ib;   fptr = GetSumm(pre, &n, &ix, &iy, &ia, &ib, &bp);   if (!fptr)   {      DoIt(pre);      fptr = GetSumm(pre, &n, &ix, &iy, &ia, &ib, &bp);      assert(fptr);   }   fprintf(stdout, "%d:\n", __LINE__);   PrintTable(n, ix, iy, ia, ib, bp);   GenFiles(pre, n, ix, iy, ia, ib, bp);   KillAllFN(fptr);   free(bp);   free(ix);}void PrintUsage(char *nam){   fprintf(stderr, "\nUSAGE: %s -p <pre>\n\n", nam);   exit(-1);}char GetFlags(int nargs, char **args){   char ch;   if (nargs < 2) return('d');   if (args[1][0] == '-')   {      if (nargs < 3) PrintUsage(args[0]);      ch = args[2][0];   }   else ch = args[1][0];   switch(ch)   {   case 's':   case 'd':   case 'c':   case 'z':       break;   case 'S':      ch = 's';      break;   case 'D':      ch = 'd';      break;   case 'C':      ch = 'c';      break;   case 'Z':      ch = 'z';      break;   default:      PrintUsage(args[0]);   }   return(ch);}main(int nargs, char **args){   char pre;   pre = GetFlags(nargs, args);   GoToTown(pre);   exit(0);}

⌨️ 快捷键说明

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