mvtest.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 577 行 · 第 1/2 页
C
577 行
/* * Automatically Tuned Linear Algebra Software v3.8.0 * (C) Copyright 2000 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 "atlas_misc.h"#include "atlas_tst.h"#include "atlas_lvl2.h"int FAx=0, MAx=0, FAy=0, MAy=0, FAa=0, MAa=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); } }}int CheckAns(int M, int N, SCALAR beta, TYPE *Y, TYPE *Y0){ TYPE eps, diff; #ifdef TCPLX const int M2 = M<<1, mul=8; #else const int M2 = M, mul=4; #endif int i, ierr=0; eps = Mjoin(PATL,epsilon)(); for (i=0; i < M2; i++) { diff = Y0[i] - Y[i]; if (diff < 0.0) diff = -diff; if (diff > N*mul*eps + 2.0*eps) { ierr = i+1; fprintf(stderr, "Y[%d] = %f, expected %f\n", i, Y[i], Y0[i]); } } return(ierr);}#ifdef TREALstatic void dumb_gemv(enum ATLAS_TRANS TA, int M, int N, SCALAR alpha, TYPE *A, int lda, TYPE *X, SCALAR beta, TYPE *Y){ register TYPE y0; int i, j; ATL_assert(alpha == ATL_rone); if (beta == ATL_rzero) Mjoin(PATL,zero)(M, Y, 1); else if (beta != ATL_rone) Mjoin(PATL,scal)(M, beta, Y, 1); if (TA == AtlasNoTrans) { for (j=0; j < N; j++) Mjoin(PATL,axpy)(M, X[j], A+j*lda, 1, Y, 1); } else { for (i=0; i < M; i++) { y0 = Y[i]; for (j=0; j < N; j++) y0 += A[i*lda+j] * X[j]; Y[i] = y0; } }}#elsestatic void dumb_gemv(enum ATLAS_TRANS TA, int M, int N, SCALAR alpha, TYPE *A, int lda, TYPE *X, SCALAR beta, TYPE *Y){ register TYPE ry, iy, rx, ix, ra, ia; int i, j; const int M2 = M<<1, N2 = N<<1; ATL_assert(SCALAR_IS_ONE(alpha)); if ( SCALAR_IS_ZERO(beta) ) Mjoin(PATL,zero)(M, Y, 1); else if ( !SCALAR_IS_ONE(beta) ) Mjoin(PATL,scal)(M, beta, Y, 1); if (TA == AtlasNoTrans) for (j=0; j < N; j++) Mjoin(PATL,axpy)(M, X+2*j, A+j*2*lda, 1, Y, 1); else if (TA == AtlasConj) for (j=0; j < N; j++) Mjoin(PATL,axpyConj)(M, X+2*j, A+j*2*lda, 1, Y, 1); else if (TA == AtlasTrans) { for (i=0; i < M2; i += 2) { ry = Y[i]; iy = Y[i+1]; for (j=0; j < N2; j += 2) { ra = A[i*lda+j]; ia = A[i*lda+j+1]; rx = X[j]; ix = X[j+1]; ry += rx * ra - ix * ia; iy += rx * ia + ix * ra; } Y[i] = ry; Y[i+1] = iy; } } else if (TA == AtlasConjTrans) { for (i=0; i < M2; i += 2) { ry = Y[i]; iy = Y[i+1]; for (j=0; j < N2; j += 2) { ra = A[i*lda+j]; ia = -A[i*lda+j+1]; rx = X[j]; ix = X[j+1]; ry += rx * ra - ix * ia; iy += rx * ia + ix * ra; } Y[i] = ry; Y[i+1] = iy; } }}#endifint RunTest(enum ATLAS_TRANS TA, int M, int N, int lda, TYPE *beta0){ #ifdef TCPLX TYPE alpha[2] = {ATL_rone, ATL_rzero}; #define beta beta0 #else TYPE alpha= ATL_rone; TYPE beta = *beta0; #endif TYPE *A, *X, *Y, *Y0; int mA, nA, ierr; char cta, ln[32]; if (TA == AtlasNoTrans) cta = 'N'; else if (TA == AtlasTrans) cta = 'T'; else if (TA == AtlasConjTrans) cta = 'C'; else cta = '-'; if (TA == AtlasNoTrans || TA == AtlasConj) { mA = M; nA = N; } else { mA = N; nA = M; } #ifdef TREAL fprintf(stdout, " TEST TA=%c, M=%d, N=%d, lda=%d, beta=%f STARTED\n", cta, M, N, lda, beta); #else fprintf(stdout, " TEST TA=%c, M=%d, N=%d, lda=%d, beta=(%f,%f) STARTED\n",
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?