rottest.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 699 行 · 第 1/2 页
C
699 行
#include "atlas_misc.h"#include <assert.h>#include "atlas_tst.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); } }}#ifndef TEST_ROTvoid ATL_ROT(const int, TYPE *, const int, TYPE *, const int, const TYPE, const TYPE); #define TEST_ROT(N_, alpha_, X_, ix_, beta_, Y_, iy_) \ ATL_ROT(N_, X_, ix_, Y_, iy_, alpha_, beta_)#endif#ifdef TREALstatic void good_rot0(const int N, TYPE *X, const int incX, TYPE *Y, const int incY, const TYPE c, const TYPE s){ int i; TYPE tmp; for (i=N; i; i--, Y += incY, X += incX) { tmp = c * *X + s * *Y; *Y = c * *Y - s * *X; *X = tmp; }}void good_rot(const int N, const TYPE alpha, TYPE *X, const int incX, const TYPE beta, TYPE *Y, const int incY){ good_rot0(N, X, incX, Y, incY, alpha, beta);}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);}#elsestatic void good_rot0 (const int N, TYPE *X, const int incx, TYPE *Y, const int incy, const TYPE c0, const TYPE s0){ const register TYPE c = c0, s = s0; register TYPE rx, ix, ry, iy; const int incX = incx<<1, incY = incy<<1; int i; if (N > 0) { for (i=N; i; i--, X += incX, Y += incY) /* maybe compiler unrolls */ { rx = *X; ix = X[1]; ry = *Y; iy = Y[1]; *X = c * rx + s * ry; X[1] = c * ix + s * iy; *Y = c * ry - s * rx; Y[1] = c * iy - s * ix; } }}void good_rot(const int N, const TYPE alpha, TYPE *X, const int incX, const TYPE beta, TYPE *Y, const int incY){ good_rot0(N, X, incX, Y, incY, alpha, beta);}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 TYPE my_infnrm(const int N, const TYPE *X, const int incX){ int i, incx = incX SHIFT; TYPE max=ATL_rzero, tmp; for (i=N; i; i--, X += incx) { #ifdef TREAL tmp = Mabs(*X); #else tmp = Mabs(*X) + Mabs(X[1]); #endif if (tmp > max) max = tmp; } return(max);}int checkXY(int N, TYPE *Xg, int incXg, TYPE *Xc, int incXc, TYPE *Yg, int incYg, TYPE *Yc, int incYc, TYPE normX, TYPE normY){ TYPE *diff; TYPE normDX, normDY, resid; TYPE eps, THRESH=50.0; TYPE Mjoin(PATL, epsilon)(void); int iret=0; eps = Mjoin(PATL,epsilon)(); diff = malloc(sizeof(TYPE)*(N SHIFT)); assert(diff); Mjoin(PATL,vdiff)(N, Xc, incXc, Xg, incXg, diff, 1); normDX = my_infnrm(N, diff, 1); Mjoin(PATL,vdiff)(N, Yc, incYc, Yg, incYg, diff, 1); normDY = my_infnrm(N, diff, 1); resid = Mmax(normDX, normDY) / (eps * Mmax(normX, ATL_rone) * Mmax(normY, ATL_rone) * N); if (resid > THRESH || resid != resid) { fprintf(stderr, "ROT resid=%e (normX=%e, normY=%e, normDX=%e, normDY=%e)!!!\n", resid, normX, normY, normDX, normDY); iret = -1; } free(diff); return(iret);}static int CheckXY(int npad, TYPE padvalX, TYPE padvalY, int N, TYPE *Xg, TYPE *Yg, TYPE normX, TYPE normY, TYPE *Xt, int incXt, TYPE *Yt, int incYt)/* * Xg & Yg are known to be inc=1, with no padding */{ TYPE *xt = Xt + (npad SHIFT), *yt = Yt + (npad SHIFT); int i0, i1, i2; if (incXt < 0) xt -= ((N-1)SHIFT)*incXt; if (incYt < 0) yt -= ((N-1)SHIFT)*incYt; i0 = checkXY(N, Xg, 1, xt, incXt, Yg, 1, yt, incYt, normX, normY); i1 = CheckPad(npad, padvalX, N, Xt, incXt); i2 = CheckPad(npad, padvalY, N, Yt, incYt); if (i0 || i1 || i2) return(1); return(0);}static void vecset(int N, TYPE alpha, TYPE *X){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?