#include #include #include #ifndef N #define N 500 #endif float a[N][N],b[N][N],c[N][N]; float ci[N][N],cs[N][N],cd[N][N]; main() { /* Petersen and Arbenz book exercise 3.1, variants of matrix multiply. Problem. BLAS routines SAXPY and SDOT, using Fortran ordering. cc -O3 thisfile.c g77 thisfile.o -lblas wpp 12 Dec. 2003 */ int i,j,k,n=N,one=1; float t1,t2,t3,t4,bjk,big,mxer1,mxer2,mxer3,er1,er2,er3,fnm2,ggl(); void saxpy_(int*,float*,float*,int*,float*,int*); float sdot_(int*,float*,int*,float*,int*); static float seed=331.0; fnm2 = 1.0/((float)N); for(j=0;jmxer1)?big:mxer1; } } er1 = fnm2*sqrt(er1); printf(" Error compare inner vs. outer:\n"); printf(" RMS error for %d x %d matrix mult. = %15.8e\n",N,N,er1); printf(" max error for %d x %d matrix mult. = %15.8e\n\n",N,N,mxer1); printf(" -------------- \n"); printf(" BLAS variants:\n"); printf(" -------------- \n"); /* outer product procedure via SAXPY */ t3 = ((float)clock())/((float) CLOCKS_PER_SEC); for(j=0;jmxer2)?big:mxer2; big = fabs(cd[j][i] - c[j][i]); mxer3 = (big>mxer3)?big:mxer3; } } er2 = fnm2*sqrt(er2); er3 = fnm2*sqrt(er3); printf(" Error compare SDOT vs. SAXPY variants: \n"); printf(" RMS err saxpy %d x %d matrix mult. = %15.8e\n",N,N,er2); printf(" max err saxpy %d x %d matrix mult. = %15.8e\n",N,N,mxer2); printf(" RMS err sdot %d x %d matrix mult. = %15.8e\n",N,N,er3); printf(" max err sdot %d x %d matrix mult. = %15.8e\n",N,N,mxer3); } float ggl(float *ds) { /* generate u(0,1) distributed random numbers. Seed ds must be saved between calls. ggl is essentially the same as the IMSL routine RNUM. W. Petersen and M. Troyer, 24 Oct. 2002, ETHZ */ double t,d2=0.2147483647e10; t = (double) *ds; t = fmod(0.16807e5*t,d2); *ds = (float) t; return((float)((t-1.0e0)/(d2-1.0e0))); }