static TYPE uumtest(enum ATLAS_ORDER Order, enum ATLAS_UPLO Uplo, int CacheSize, int N, int lda, double *tim) { TYPE *A, *Ag, *LmLt; double t0, t1; TYPE normA, eps, resid; enum ATLAS_UPLO MyUplo = Uplo; if (Order == CblasRowMajor) { if (Uplo == CblasUpper) MyUplo = CblasLower; else MyUplo = CblasUpper; } eps = Mjoin(PATL,epsilon)(); A = malloc(ATL_MulBySize(lda)*N + ATL_MulBySize(N)*N); if (A == NULL) return(-1); Ag = A + lda*(N SHIFT); t0 = ATL_flushcache(CacheSize); lltgen(MyUplo, N, A, lda, N*1029+lda); lltgen(MyUplo, N, Ag, N, N*1029+lda); normA = lltnrm1(MyUplo, N, A, lda); #ifdef DEBUG Mjoin(PATL,geprint)("A", N, N, A, lda); Mjoin(PATL,geprint)("Ag", N, N, Ag, N); #endif t0 = ATL_flushcache(-1); t0 = time00(); test_lauum(Order, Uplo, N, A, lda); t1 = time00() - t0; *tim = t1; t0 = ATL_flushcache(0); ATL_checkpad(MyUplo, N, A, lda); if (Uplo == CblasUpper) LmLt = ATL_UmulUt(Order, N, Ag, N); else LmLt = ATL_LtmulL(Order, N, Ag, N); #ifdef DEBUG Mjoin(PATL,geprint)("A", N, N, A, lda); Mjoin(PATL,geprint)("Ag", N, N, LmLt, N); #endif lltdiff(MyUplo, N, A, lda, LmLt, N); #ifdef DEBUG Mjoin(PATL,geprint)("A-L*Lt", N, N, LmLt, N); #endif resid = lltnrm1(MyUplo, N, LmLt, N) / (normA * eps * N); if (resid > 10.0 || resid != resid) fprintf(stderr, "normA=%e, eps=%e, num=%e\n", normA, eps, resid); free(LmLt); free(A); return(resid); }
static TYPE llttest(enum ATLAS_UPLO Uplo, int CacheSize, int N, int lda, double *tim) { TYPE *A, *LmLt; int i; double t0, t1; TYPE normA, eps, resid; eps = Mjoin(PATL,epsilon)(); A = malloc(ATL_MulBySize(lda)*N); if (A == NULL) return(-1); t0 = ATL_flushcache(CacheSize); lltgen(Uplo, N, A, lda, N*1029+lda); normA = lltnrm1(Uplo, N, A, lda); #ifdef DEBUG Mjoin(PATL,geprint)("A0", N, N, A, lda); #endif t0 = ATL_flushcache(-1); t0 = time00(); test_potrf(Uplo, N, A, lda); t1 = time00() - t0; *tim = t1; t0 = ATL_flushcache(0); #ifdef DEBUG Mjoin(PATL,geprint)("L", N, N, A, lda); #endif ATL_checkpad(Uplo, N, A, lda); if (Uplo == AtlasUpper) LmLt = ATL_UtmulU(N, A, lda); else LmLt = ATL_LmulLt(N, A, lda); #ifdef DEBUG Mjoin(PATL,geprint)("L*Lt", N, N, LmLt, N); #endif lltgen(Uplo, N, A, lda, N*1029+lda); /* regen A over LLt */ lltdiff(Uplo, N, A, lda, LmLt, N); #ifdef DEBUG Mjoin(PATL,geprint)("A-L*Lt", N, N, LmLt, N); #endif resid = lltnrm1(Uplo, N, LmLt, N); #ifdef DEBUG if (resid/(normA*eps*N) > 10.0) fprintf(stderr, "normA=%e, eps=%e, num=%e\n", normA, eps, resid); #endif resid /= (normA * eps * N); free(LmLt); free(A); return(resid); }
static TYPE trtritest(enum ATLAS_ORDER Order, enum ATLAS_UPLO Uplo, enum ATLAS_DIAG Diag, int CacheSize, int N, int lda, double *tim) { TYPE *A, *Acompare; int i; double t0, t1; TYPE normA, eps, resid; /*int ierr;*/ #ifdef TCPLX const TYPE one[2]={ATL_rone, ATL_rzero}; #else const TYPE one = ATL_rone; #endif eps = Mjoin(PATL,epsilon)(); A = malloc(ATL_MulBySize(lda)*N); Acompare = malloc(ATL_MulBySize(lda)*N); if (A == NULL) return(-1); if (Acompare == NULL) return(-1); t0 = ATL_flushcache(CacheSize); /* create random, diagonally dominant matrix with magic value at unused places. Last number is just the random seed. */ trigen(Order, Uplo, Diag, N, A, lda, PADVAL, N*1029+lda); /* Create backup to calculate residual. This one has to be used as a full matrix, so it has zero fills and correct diagonal. */ trigen(Order, Uplo, Diag, N, Acompare, lda, ATL_rzero, N*1029+lda); if (Diag==AtlasUnit) for (i=0; i < N; i++) Acompare[(i*(lda+1)) SHIFT] = ATL_rone; normA = trinrm1(Order,Uplo, Diag, N, A, lda); #ifdef DEBUG Mjoin(PATL,geprint)("A0", N, N, A, lda); #endif t0 = ATL_flushcache(-1); /* Calculate and time a solution */ t0 = time00(); test_trtri(Order, Uplo, Diag, N, A, lda); t1 = time00() - t0; *tim = t1; /* if (ierr != 0) { fprintf(stderr, "Return values != 0 : %d \n",ierr); return(9999.9999); }*/ t0 = ATL_flushcache(0); /* Instroduce a padding error. */ /* A[(5+5*lda)SHIFT]=114.0; */ #ifdef DEBUG Mjoin(PATL,geprint)("L", N, N, A, lda); #endif ATL_checkpad(Order, Uplo, Diag, N, A, lda); /* Calculate A^{-1}*A */ cblas_trmm(Order,CblasLeft,Uplo,AtlasNoTrans,Diag, N,N,one,A,lda,Acompare,lda); #ifdef DEBUG Mjoin(PATL,geprint)("A^{-1}*A", N, N, Acompare, N); #endif /* Subtract diagonal */ for (i=0; i < N; i++) Acompare[i*((lda+1) SHIFT)] -= ATL_rone; /* resid = trinrm1(Order, Uplo,AtlasNonUnit,N,Acompare,lda); fprintf(stderr, "normA=%e, eps=%e, num=%e\n", normA, eps, resid); */ resid = Mjoin(PATL,genrm1)(N, N, Acompare, lda); #ifdef DEBUG if (resid/(normA*eps*N) > 10.0) fprintf(stderr, "normA=%e, eps=%e, num=%e\n", normA, eps, resid); #endif resid /= (normA * eps * N); free(Acompare); free(A); return(resid); }