axpbytst.c

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

C
691
字号
#include "atlas_misc.h"#include <assert.h>int FAx=0, MAx=0, FAy=0, MAy=0;#include <stdio.h>#include <stdlib.h>#include <assert.h>struct FA_allocs{   void *mem, *memA;   struct FA_allocs *next;} *allocQ=NULL;struct FA_allocs *NewAlloc(size_t size, struct FA_allocs *next,                           int align, int misalign)/* * Allocates size allocation that is aligned to [align], but not aligned * to [misalign].  Therefore, misalign > align.  Align must minimally be sizeof * while misalign may be 0 if we don't need to avoid a particular alignment. */{   void *vp;   char *cp;   struct FA_allocs *ap;   int n, i;   const int malign = align >= misalign ? align : misalign;   n = size + align + malign;   i = (n >> 3)<<3;   if (n != i)      n += n - i;   cp = malloc(n + sizeof(struct FA_allocs));   assert(cp);   ap = (struct FA_allocs *) (cp + n);   ap->mem = cp;/* * Align to min alignment */   ap->memA = align ? (void*) ((((size_t) cp)/align)*align + align) : cp;/* * Misalign to misalign */   if (misalign)   {      if (((size_t)ap->memA)%misalign == 0)         ap->memA = ((char*)ap->memA) + align;   }   ap->next = next;   return(ap);}/* * no-align malloc free retaining system default behavior */void *NA_malloc(size_t size){   return(malloc(size));}void *NA_calloc(size_t n, size_t size){   return(calloc(n, size));}void NA_free(void *ptr){   free(ptr);}/* * malloc/free pair that aligns data to align, but not to misalign */void *FA_malloc(size_t size, int align, int misalign){   if ((!misalign && align <= 8) || !size)      return(malloc(size));   else   {      allocQ = NewAlloc(size, allocQ, align, misalign);      return(allocQ->memA);   }}void *FA_calloc(size_t n, size_t size, int align, int misalign){   char *cp;   int *ip;   double *dp;   size_t i;   size_t tsize;   tsize = n * size;   cp = FA_malloc(tsize, align, misalign);   if (size == sizeof(int))      for (ip=(int*)cp,i=0; i < n; i++)        ip[i] = 0;   else if (size == sizeof(double))      for (dp=(double*)cp,i=0; i < n; i++)        dp[i] = 0.0;   else      for (i=0; i < tsize; i++)        cp[i] = 0;   return(cp);}void FA_free(void *ptr, int align, int misalign)/* * Part of malloc/free pair that aligns data to FALIGN */{   struct FA_allocs *ap, *prev;   if (ptr)   {      if ((!misalign && align <= 8))         free(ptr);      else      {         for (ap=allocQ; ap && ap->memA != ptr; ap = ap->next) prev = ap;         if (!ap)         {            fprintf(stderr, "Couldn't find mem=%ld\nmemQ=\n", ptr);            for (ap=allocQ; ap; ap = ap->next)               fprintf(stderr, "   %ld, %ld\n", ap->memA, ap->mem);         }         assert(ap);         if (ap == allocQ)            allocQ = allocQ->next;         else            prev->next = ap->next;         free(ap->mem);      }   }}#define dumb_seed(iseed_) srand(iseed_)#ifndef RAND_MAX  /* rather dangerous non-ansi workaround */   #define RAND_MAX ((unsigned long)(1<<30))#endif#define dumb_rand() ( 0.5 - ((double)rand())/((double)RAND_MAX) )#ifdef TEST_F77   ___main(){} __main(){} MAIN__(){} _MAIN_(){}#include "atlas_f77blas.h"static void TEST_AXPBY   (const int N, const SCALAR alpha, const TYPE *X, const int incX,    const SCALAR beta, TYPE *Y, const int incY){   #ifdef ATL_FunkyInts      const F77_INTEGER F77N=N, F77incX=incX, F77incY=incY;   #else      const int F77N=N, F77incX=incX, F77incY=incY;   #endif   #ifdef TREAL      F77axpby(&F77N, &alpha, X, &F77incX, &beta, Y, &F77incY);   #else      F77axpby(&F77N, alpha, X, &F77incX, beta, Y, &F77incY);   #endif}#else   #include "cblas.h"   #define TEST_AXPBY Mjoin(Mjoin(catlas_,PRE),axpby)#endif#ifdef TREALvoid good_axpby(const int N, const SCALAR alpha, const TYPE *X, const int incX,                const SCALAR beta, TYPE *Y, const int incY){   int i;   for (i=0; i < N; i++, Y += incY, X += incX) *Y = alpha * *X + beta * *Y;}int checkY(int N, TYPE *Yg, int incYg, TYPE *Yc, int incYc){   int i, iret=0;   TYPE eps, diff;   TYPE Mjoin(PATL, epsilon)(void);   eps = Mjoin(PATL,epsilon)();   for (i=0; i < N; i++, Yg += incYg, Yc += incYc)   {      diff = *Yg - *Yc;      diff = Mabs(diff);      if (diff > 4*eps)      {         iret = i;         fprintf(stderr, "ERROR: Y[%d], correct=%f, computed=%f\n",                 i, *Yg, *Yc);      }   }   return(iret);}int CheckPad(int npad, TYPE padval, int N, TYPE *Y, int incY){   int i, iret=0;   incY = Mabs(incY);   for (i=0; i < npad; i++)   {      if (Y[i] != padval)      {         iret = i;         fprintf(stderr, "OVERWRITE %f IN PREPAD %d before beginning of Y!!\n",                 Y[i], npad-i);      }   }   Y += npad;   if (incY != 1)   {      for (i=0; i < N*incY; i++)      {         if (i%incY)         {            if (Y[i] != padval)            {               iret = i;               fprintf(stderr, "INTERNAL OVERWRITE %f AT POSITION %d!!\n",                       Y[i], i);            }         }      }   }   Y += 1 + (N-1)*incY;   for (i=0; i < npad; i++)   {      if (Y[i] != padval)      {         iret = i;         fprintf(stderr, "OVERWRITE %f IN POSTPAD %d past end of Y!!\n",                 Y[i], i+1);      }   }   return(iret);}#elsevoid good_axpby(const int N, const SCALAR alpha, const TYPE *X, const int incx,                const SCALAR beta, TYPE *Y, const int incy){   int i;   const int incX=incx+incx, incY=incy+incy;   const register TYPE ra=(*alpha), ia=alpha[1], rb=(*beta), ib=beta[1];   register TYPE rx, ix, ry, iy;   for (i=0; i < N; i++, Y += incY, X += incX)   {      rx = *X; ix = X[1];      ry = *Y; iy = Y[1];      *Y   = rx * ra - ix * ia + rb * ry - ib * iy;      Y[1] = rx * ia + ix * ra + rb * iy + ib * ry;   }}int checkY(int N, TYPE *Yg, int incYg, TYPE *Yc, int incYc){   int i, iret=0;   TYPE rdiff, idiff, eps, maxerr;   TYPE Mjoin(PATL, epsilon)(void);   eps = Mjoin(PATL,epsilon)();   maxerr = 9*eps;   incYg *= 2; incYc *= 2;   for (i=0; i < N; i++, Yg += incYg, Yc += incYc)   {      rdiff = *Yg - *Yc;      idiff = Yg[1] - Yc[1];      rdiff = Mabs(rdiff);      idiff = Mabs(idiff);      if (rdiff > maxerr)      {         iret = i;         fprintf(stderr, "ERROR: Y[%d], real, correct=%e, computed=%e\n",                 i, *Yg, *Yc);      }      if (idiff > maxerr)      {         iret = i;         fprintf(stderr, "ERROR: Y[%d], imag, correct=%e, computed=%e\n",                 i, Yg[1], Yc[1]);      }   }   return(iret);}int CheckPad(int npad, TYPE padval, int N, TYPE *Y, int incY){   int i, n, iret=0;   incY = Mabs(incY);   npad *= 2;   for (i=0; i < npad; i++)   {      if (Y[i] != padval)      {         iret = i;         fprintf(stderr, "OVERWRITE %f IN PREPAD %d before beginning of Y!!\n",                 Y[i], npad-i);      }   }   Y += npad;   if (incY != 1)   {      for (i=0; i < N*incY; i++)      {         if (i%incY)         {            if (Y[2*i] != padval)            {               iret = i;               fprintf(stderr, "INTERNAL REAL OVERWRITE %f AT POSITION %d!!\n",                       Y[2*i], i);            }            if (Y[2*i+1] != padval)            {               iret = i+1;               fprintf(stderr, "INTERNAL IMAG OVERWRITE %f AT POSITION %d!!\n",                       Y[2*i+1], i);            }         }      }   }   Y += 2 + 2*(N-1)*incY;   for (i=0; i < npad; i++)   {      if (Y[i] != padval)      {         iret = i;         fprintf(stderr, "OVERWRITE %f IN POSTPAD %d past end of Y!!\n",                 Y[i], i+1);      }   }   return(iret);}#endifstatic int CheckY(int npad, TYPE padval, int N, TYPE *Yg, int incYg,                  TYPE *Yt, int incYt){   int i0, i1;   incYg = Mabs(incYg);   incYt = Mabs(incYt);   i0 = checkY(N, Yg+(npad SHIFT), incYg, Yt+(npad SHIFT), incYt);   i1 = CheckPad(npad, padval, N, Yt, incYt);   if (!i0 && !i1) return(0);   return(1);}static void vecset(int N, TYPE alpha, TYPE *X){   int i;   #ifdef TCPLX      N *= 2;   #endif   for (i=0; i < N; i++) X[i] = alpha;}

⌨️ 快捷键说明

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