54 BLAS_error(
char *rname,
int err,
int val,
int x) {
55 fprintf( stderr,
"%s %d %d %d\n", rname, err, val, x );
62 int m,
int n,
const double *a,
int lda,
double *res) {
63 int i, j;
float anorm, v;
64 char rname[] =
"BLAS_dge_norm";
66 if (order !=
blas_colmajor) BLAS_error( rname, -1, order, 0 );
78 anorm = sqrt( anorm );
81 for (i = 0; i < m; ++i) {
83 for (j = 0; j < n; ++j) {
84 v += fabs( a[i + j * lda] );
90 BLAS_error( rname, -2, norm, 0 );
94 if (res) *res = anorm;
99 BLAS_dpow_di(
double x,
int n) {
107 for (; n; n >>= 1, x *= x) {
118 double eps = 1.0, r = 1.0, o = 1.0, b = 2.0;
119 int t = 53, l = 1024, m = -1021;
120 char rname[] =
"BLAS_dfpinfo";
122 if ((
sizeof eps) ==
sizeof(
float)) {
133 eps = BLAS_dpow_di( b, -t );
135 r = BLAS_dpow_di( b, m-1 );
139 o = (o * BLAS_dpow_di( b, l-1 )) * b;
145 BLAS_error( rname, -1, cmach, 0 );
152 static int check_solution(
int,
int,
double*,
int,
double*,
double*,
int,
double);
159 USAGE(
"POSV",
"N LDA NRHS LDB",
160 " - N : the size of the matrix\n"
161 " - LDA : leading dimension of the matrix A\n"
162 " - NRHS : number of RHS\n"
163 " - LDB : leading dimension of the RHS B\n");
167 int N = atoi(argv[0]);
168 int LDA = atoi(argv[1]);
169 int NRHS = atoi(argv[2]);
170 int LDB = atoi(argv[3]);
173 int info_solution, info_factorization;
176 double *A1 = (
double *)malloc(LDA*N*
sizeof(
double));
177 double *A2 = (
double *)malloc(LDA*N*
sizeof(
double));
178 double *B1 = (
double *)malloc(LDB*NRHS*
sizeof(
double));
179 double *B2 = (
double *)malloc(LDB*NRHS*
sizeof(
double));
182 if ((!A1)||(!A2)||(!B1)||(!B2)){
183 printf(
"Out of Memory \n ");
206 printf(
"------ TESTS FOR PLASMA DPOSV ROUTINE ------- \n");
207 printf(
" Size of the Matrix %d by %d\n", N, N);
209 printf(
" The matrix A is randomly generated for each test.\n");
210 printf(
"============\n");
211 printf(
" The relative machine precision (eps) is to be %e \n", eps);
212 printf(
" Computational tests pass if scaled residuals are less than 60.\n");
219 info_solution =
check_solution(N, NRHS, A1, LDA, B1, B2, LDB, eps);
221 if ( (info_solution == 0) && (info_factorization == 0) ) {
222 printf(
"***************************************************\n");
223 printf(
" ---- TESTING DPOSV ...................... PASSED !\n");
224 printf(
"***************************************************\n");
227 printf(
"***************************************************\n");
228 printf(
" - TESTING DPOSV ... FAILED !\n");
229 printf(
"***************************************************\n");
249 printf(
"------ TESTS FOR PLASMA DPOTRF + DPOTRS ROUTINE ------- \n");
250 printf(
" Size of the Matrix %d by %d\n", N, N);
252 printf(
" The matrix A is randomly generated for each test.\n");
253 printf(
"============\n");
254 printf(
" The relative machine precision (eps) is to be %e \n", eps);
255 printf(
" Computational tests pass if scaled residuals are less than 60.\n");
259 info_solution =
check_solution(N, NRHS, A1, LDA, B1, B2, LDB, eps);
261 if ((info_solution == 0)&(info_factorization == 0)){
262 printf(
"***************************************************\n");
263 printf(
" ---- TESTING DPOTRF + DPOTRS ............ PASSED !\n");
264 printf(
"***************************************************\n");
267 printf(
"****************************************************\n");
268 printf(
" - TESTING DPOTRF + DPOTRS ... FAILED !\n");
269 printf(
"****************************************************\n");
287 N, NRHS, 1.0, A2, LDA, B2, LDB);
289 N, NRHS, 1.0, A2, LDA, B2, LDB);
292 printf(
"------ TESTS FOR PLASMA DPOTRF + DTRSM + DTRSM ROUTINE ------- \n");
293 printf(
" Size of the Matrix %d by %d\n", N, N);
295 printf(
" The matrix A is randomly generated for each test.\n");
296 printf(
"============\n");
297 printf(
" The relative machine precision (eps) is to be %e \n", eps);
298 printf(
" Computational tests pass if scaled residuals are less than 60.\n");
302 info_solution =
check_solution(N, NRHS, A1, LDA, B1, B2, LDB, eps);
304 if ((info_solution == 0)&(info_factorization == 0)){
305 printf(
"***************************************************\n");
306 printf(
" ---- TESTING DPOTRF + DTRSM + DTRSM ..... PASSED !\n");
307 printf(
"***************************************************\n");
310 printf(
"***************************************************\n");
311 printf(
" - TESTING DPOTRF + DTRSM + DTRSM ... FAILED !\n");
312 printf(
"***************************************************\n");
315 free(A1); free(A2); free(B1); free(B2);
328 int info_factorization;
331 double *Residual = (
double *)malloc(N*N*
sizeof(
double));
332 double *L1 = (
double *)malloc(N*N*
sizeof(
double));
333 double *L2 = (
double *)malloc(N*N*
sizeof(
double));
334 double *work = (
double *)malloc(N*
sizeof(
double));
336 memset((
void*)L1, 0, N*N*
sizeof(
double));
337 memset((
void*)L2, 0, N*N*
sizeof(
double));
341 LAPACKE_dlacpy_work(LAPACK_COL_MAJOR,
' ', N, N, A1, LDA, Residual, N);
345 LAPACKE_dlacpy_work(LAPACK_COL_MAJOR,
'u', N, N, A2, LDA, L1, N);
346 LAPACKE_dlacpy_work(LAPACK_COL_MAJOR,
'u', N, N, A2, LDA, L2, N);
347 cblas_dtrmm(
CblasColMajor,
CblasLeft,
CblasUpper,
CblasTrans,
CblasNonUnit, N, N, (alpha), L1, N, L2, N);
350 LAPACKE_dlacpy_work(LAPACK_COL_MAJOR,
'l', N, N, A2, LDA, L1, N);
351 LAPACKE_dlacpy_work(LAPACK_COL_MAJOR,
'l', N, N, A2, LDA, L2, N);
352 cblas_dtrmm(
CblasColMajor,
CblasRight,
CblasLower,
CblasTrans,
CblasNonUnit, N, N, (alpha), L1, N, L2, N);
356 for (i = 0; i < N; i++)
357 for (j = 0; j < N; j++)
358 Residual[j*N+i] = L2[j*N+i] - Residual[j*N+i];
363 printf(
"============\n");
364 printf(
"Checking the Cholesky Factorization \n");
365 printf(
"-- ||L'L-A||_oo/(||A||_oo.N.eps) = %e \n",Rnorm/(Anorm*N*eps));
367 if ( isnan(Rnorm/(Anorm*N*eps)) || isinf(Rnorm/(Anorm*N*eps)) || (Rnorm/(Anorm*N*eps) > 60.0) ){
368 printf(
"-- Factorization is suspicious ! \n");
369 info_factorization = 1;
372 printf(
"-- Factorization is CORRECT ! \n");
373 info_factorization = 0;
376 free(Residual); free(L1); free(L2); free(work);
378 return info_factorization;
386 static int check_solution(
int N,
int NRHS,
double *A1,
int LDA,
double *B1,
double *B2,
int LDB,
double eps )
389 double Rnorm, Anorm, Xnorm, Bnorm, result;
391 double *work = (
double *)malloc(N*
sizeof(
double));
400 cblas_dgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, N, NRHS, N, (alpha), A1, LDA, B2, LDB, (beta), B1, LDB);
403 if (getenv(
"PLASMA_TESTING_VERBOSE"))
404 printf(
"||A||_oo=%f\n||X||_oo=%f\n||B||_oo=%f\n||A X - B||_oo=%e\n", Anorm, Xnorm, Bnorm, Rnorm );
406 result = Rnorm / ( (Anorm*Xnorm+Bnorm)*N*eps ) ;
407 printf(
"============\n");
408 printf(
"Checking the Residual of the solution \n");
409 printf(
"-- ||Ax-B||_oo/((||A||_oo||x||_oo+||B||_oo).N.eps) = %e \n", result);
411 if ( isnan(Xnorm) || isinf(Xnorm) || isnan(result) || isinf(result) || (result > 60.0) ) {
412 printf(
"-- The solution is suspicious ! \n");
416 printf(
"-- The solution is CORRECT ! \n");
422 return info_solution;