diff --git a/testing/testing_zcheck.c b/testing/testing_zcheck.c index b5dc2a3356a3c8cca6eadd7b27b031e455c861f3..d7d9aff0687586c59d82c0dd0ab67737e07e0fc5 100644 --- a/testing/testing_zcheck.c +++ b/testing/testing_zcheck.c @@ -172,6 +172,9 @@ int check_znorm_std( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_norm /* Compares the norms */ result = fabs( norm_cham - norm_lapack ) / ( norm_lapack * eps ); + run_arg_add_double( args, "||A||", norm_cham ); + run_arg_add_double( args, "||B||", norm_lapack ); + switch(norm_type) { case ChamInfNorm: /* Sum order on the line can differ */ @@ -187,15 +190,20 @@ int check_znorm_std( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_norm break; case ChamMaxNorm: default: +#if defined(PRECISION_z) || defined(PRECISION_c) + /* Add a factor two to macth different implementation of cabs */ + result = result / 2; +#else /* result should be perfectly equal */ +#endif ; } + run_arg_add_double( args, "||R||", result ); info_solution = ( result < 1 ) ? 0 : 1; free(work); - (void)args; return info_solution; } @@ -625,7 +633,7 @@ int check_zsymm_std( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_side An = M; } else { - normTypeA = '0'; + normTypeA = 'O'; normTypeB = 'I'; An = N; } @@ -1349,6 +1357,33 @@ int check_zxxtrf( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo return info_global; } +int check_zxxtrf_std( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, int M, int N, + CHAMELEON_Complex64_t *A, CHAMELEON_Complex64_t *LU, int LDA ) +{ + int info_global; + CHAM_desc_t *descA, *descLU; + int P = parameters_getvalue_int( "P" ); + int Q = parameters_compute_q( P ); + intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" ); + int nb = run_arg_get_int( args, "nb", 320 ); + + CHAMELEON_Desc_Create( + &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q ); + CHAMELEON_Desc_Create( + &descLU, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q ); + + CHAMELEON_zLap2Desc( uplo, A, LDA, descA ); + CHAMELEON_zLap2Desc( uplo, LU, LDA, descLU ); + + info_global = check_zxxtrf( args, mtxtype, uplo, descA, descLU ); + + CHAMELEON_Desc_Destroy( &descA ); + CHAMELEON_Desc_Destroy( &descLU ); + + (void)args; + return info_global; +} + /** ******************************************************************************** * @@ -1418,6 +1453,12 @@ int check_zsolve( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t tra Rnorm = CHAMELEON_zlange_Tile( ChamOneNorm, descB ); result = Rnorm / ( Anorm * Xnorm * chameleon_max( M, N ) * eps ); + run_arg_add_double( args, "||A||", Anorm ); + run_arg_add_double( args, "||X||", Xnorm ); + run_arg_add_double( args, "||B||", Bnorm ); + run_arg_add_double( args, "||Ax-b||", Rnorm ); + run_arg_add_double( args, "||Ax-b||/N/eps/(||A||||x||+||b||", result ); + if ( isnan(Xnorm) || isinf(Xnorm) || isnan(result) || isinf(result) || (result > 60.0) ) { info_local = 1; } @@ -1437,6 +1478,37 @@ int check_zsolve( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t tra return info_global; } +int check_zsolve_std( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t trans, cham_uplo_t uplo, int N, int NRHS, + CHAMELEON_Complex64_t *A, int LDA, CHAMELEON_Complex64_t *X, CHAMELEON_Complex64_t *B, int LDB ) +{ + int info_global; + CHAM_desc_t *descA, *descB, *descX; + int P = parameters_getvalue_int( "P" ); + int Q = parameters_compute_q( P ); + intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" ); + int nb = run_arg_get_int( args, "nb", 320 ); + + CHAMELEON_Desc_Create( + &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q ); + CHAMELEON_Desc_Create( + &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q ); + CHAMELEON_Desc_Create( + &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q ); + + CHAMELEON_zLap2Desc( uplo, A, LDA, descA ); + CHAMELEON_zLap2Desc( uplo, B, LDB, descB ); + CHAMELEON_zLap2Desc( uplo, X, LDB, descX ); + + info_global = check_zsolve( args, mtxtype, trans, uplo, descA, descX, descB ); + + CHAMELEON_Desc_Destroy( &descA ); + CHAMELEON_Desc_Destroy( &descB ); + CHAMELEON_Desc_Destroy( &descX ); + + (void)args; + return info_global; +} + /** ******************************************************************************** * @@ -1591,6 +1663,33 @@ int check_ztrtri( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t return info_global; } +int check_ztrtri_std( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t uplo, cham_diag_t diag, + int N, CHAMELEON_Complex64_t *A0, CHAMELEON_Complex64_t *Ai, int LDA ) +{ + int info_global; + CHAM_desc_t *descA0, *descAi; + int P = parameters_getvalue_int( "P" ); + int Q = parameters_compute_q( P ); + intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" ); + int nb = run_arg_get_int( args, "nb", 320 ); + + CHAMELEON_Desc_Create( + &descA0, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q ); + CHAMELEON_Desc_Create( + &descAi, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q ); + + CHAMELEON_zLap2Desc( uplo, A0, LDA, descA0 ); + CHAMELEON_zLap2Desc( uplo, Ai, LDA, descAi ); + + info_global = check_ztrtri( args, matrix_type, uplo, diag, descA0, descAi ); + + CHAMELEON_Desc_Destroy( &descA0 ); + CHAMELEON_Desc_Destroy( &descAi ); + + (void)args; + return info_global; +} + int check_zortho( run_arg_list_t *args, CHAM_desc_t *descQ ) { int info_local, info_global; diff --git a/testing/testing_zcheck.h b/testing/testing_zcheck.h index f34ca857919e3aa14d8595e6daeddc83408596ae..aa247db116f4f77d70cf7b56669d6a82f991f8a7 100644 --- a/testing/testing_zcheck.h +++ b/testing/testing_zcheck.h @@ -62,10 +62,15 @@ static inline int check_ztrmm ( run_arg_list_t *args, int check_func, ch CHAMELEON_Complex64_t alpha, CHAM_desc_t *descA, CHAM_desc_t *descB, CHAM_desc_t *descBref ) { return 0; } static inline int check_zlauum ( run_arg_list_t *args, cham_uplo_t uplo, CHAM_desc_t *descA1, CHAM_desc_t *descA2 ) { return 0; } static inline int check_zxxtrf ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, CHAM_desc_t *descA1, CHAM_desc_t *descA2 ) { return 0; } +static inline int check_zxxtrf_std ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, int M, int N, CHAMELEON_Complex64_t *A, CHAMELEON_Complex64_t *LU, int LDA ) { return 0; } static inline int check_zsolve ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t trans, cham_uplo_t uplo, CHAM_desc_t *descA, CHAM_desc_t *descX, CHAM_desc_t *descB ) { return 0; } +static inline int check_zsolve_std ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t trans, cham_uplo_t uplo, int N, int NRHS, + CHAMELEON_Complex64_t *A, int LDA, CHAMELEON_Complex64_t *X, CHAMELEON_Complex64_t *B, int LDB ) { return 0; } static inline int check_ztrtri ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, cham_diag_t diag, CHAM_desc_t *descA, CHAM_desc_t *descAi ) { return 0; } +static inline int check_ztrtri_std ( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t uplo, cham_diag_t diag, + int N, CHAMELEON_Complex64_t *A0, CHAMELEON_Complex64_t *Ai, int LDA ) { return 0; } /* Using QR factorization */ static inline int check_zortho ( run_arg_list_t *args, CHAM_desc_t *descQ ) { return 0; } @@ -113,10 +118,15 @@ int check_ztrmm ( run_arg_list_t *args, int check_func, cham_side_t side CHAMELEON_Complex64_t alpha, CHAM_desc_t *descA, CHAM_desc_t *descB, CHAM_desc_t *descBref ); int check_zlauum ( run_arg_list_t *args, cham_uplo_t uplo, CHAM_desc_t *descA1, CHAM_desc_t *descA2 ); int check_zxxtrf ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, CHAM_desc_t *descA1, CHAM_desc_t *descA2 ); +int check_zxxtrf_std ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, int M, int N, CHAMELEON_Complex64_t *A, CHAMELEON_Complex64_t *LU, int LDA ); int check_zsolve ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t trans, cham_uplo_t uplo, CHAM_desc_t *descA, CHAM_desc_t *descX, CHAM_desc_t *descB ); +int check_zsolve_std ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_trans_t trans, cham_uplo_t uplo, int N, int NRHS, + CHAMELEON_Complex64_t *A, int LDA, CHAMELEON_Complex64_t *X, CHAMELEON_Complex64_t *B, int LDB ); int check_ztrtri ( run_arg_list_t *args, cham_mtxtype_t mtxtype, cham_uplo_t uplo, cham_diag_t diag, CHAM_desc_t *descA, CHAM_desc_t *descAi ); +int check_ztrtri_std ( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t uplo, cham_diag_t diag, + int N, CHAMELEON_Complex64_t *A0, CHAMELEON_Complex64_t *Ai, int LDA ); /* Using QR factorization */ int check_zortho ( run_arg_list_t *args, CHAM_desc_t *descQ );