axpbytest.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 670 行 · 第 1/2 页
C
670 行
#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) )#ifndef TEST_AXPBY #define TEST_AXPBY ATL_UAXPBY#endifvoid TEST_AXPBY(const int N, const SCALAR al, const TYPE *X, const int incX, const SCALAR be, TYPE *Y, const int incY);#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;}static TYPE *getvec(int npad, TYPE padval, int N, int incX, int FA, int MA){ TYPE *X, *x; int i, n; if (N <= 0) return(NULL);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?