int main () { int cores = 2; int M = 15; int N = 10; int LDA = 15; int NRHS = 5; int LDB = 15; int info; int info_solution; int i,j; int LDAxN = LDA*N; int LDBxNRHS = LDB*NRHS; PLASMA_Complex32_t *A1 = (PLASMA_Complex32_t *)malloc(LDA*N*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *A2 = (PLASMA_Complex32_t *)malloc(LDA*N*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *B1 = (PLASMA_Complex32_t *)malloc(LDB*NRHS*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *B2 = (PLASMA_Complex32_t *)malloc(LDB*NRHS*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *T; /* Check if unable to allocate memory */ if ((!A1)||(!A2)||(!B1)||(!B2)){ printf("Out of Memory \n "); exit(0); } /* Plasma Initialization */ PLASMA_Init(cores); printf("-- PLASMA is initialized to run on %d cores. \n",cores); /* Allocate T */ PLASMA_Alloc_Workspace_cgeqrf(M, N, &T); /* Initialize A1 and A2 */ LAPACKE_clarnv_work(IONE, ISEED, LDAxN, A1); for (i = 0; i < M; i++) for (j = 0; j < N; j++) A2[LDA*j+i] = A1[LDA*j+i] ; /* Initialize B1 and B2 */ LAPACKE_clarnv_work(IONE, ISEED, LDBxNRHS, B1); for (i = 0; i < M; i++) for (j = 0; j < NRHS; j++) B2[LDB*j+i] = B1[LDB*j+i] ; /* Factorization QR of the matrix A2 */ info = PLASMA_cgeqrf(M, N, A2, LDA, T); /* Solve the problem */ info = PLASMA_cgeqrs(M, N, NRHS, A2, LDA, T, B2, LDB); /* Check the solution */ info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB); if ((info_solution != 0)|(info != 0)) printf("-- Error in CGEQRS example ! \n"); else printf("-- Run of CGEQRS example successful ! \n"); free(A1); free(A2); free(B1); free(B2); free(T); PLASMA_Finalize(); exit(0); }
int testing_cgels(int argc, char **argv) { int mode = 0; if ( argc < 1 ){ goto usage; } else { mode = atoi(argv[0]); } /* Check for number of arguments*/ if ( ((mode == 0) && (argc != 6)) || ((mode != 0) && (argc != 7)) ){ usage: USAGE("GELS", "MODE M N LDA NRHS LDB [RH]", " - MODE : 0: flat, 1: tree (RH needed)\n" " - M : number of rows of the matrix A\n" " - N : number of columns of the matrix A\n" " - LDA : leading dimension of the matrix A\n" " - NRHS : number of RHS\n" " - LDB : leading dimension of the matrix B\n" " - RH : Size of each subdomains\n"); return -1; } int M = atoi(argv[1]); int N = atoi(argv[2]); int LDA = atoi(argv[3]); int NRHS = atoi(argv[4]); int LDB = atoi(argv[5]); int rh; int K = min(M, N); float eps; int info_ortho, info_solution, info_factorization; int i,j; int LDAxN = LDA*N; int LDBxNRHS = LDB*NRHS; PLASMA_Complex32_t *A1 = (PLASMA_Complex32_t *)malloc(LDA*N*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *A2 = (PLASMA_Complex32_t *)malloc(LDA*N*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *B1 = (PLASMA_Complex32_t *)malloc(LDB*NRHS*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *B2 = (PLASMA_Complex32_t *)malloc(LDB*NRHS*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *Q = (PLASMA_Complex32_t *)malloc(LDA*N*sizeof(PLASMA_Complex32_t)); PLASMA_Complex32_t *T; /* Check if unable to allocate memory */ if ((!A1)||(!A2)||(!B1)||(!B2)||(!Q)){ printf("Out of Memory \n "); return -2; } if ( mode ) { rh = atoi(argv[6]); PLASMA_Set(PLASMA_HOUSEHOLDER_MODE, PLASMA_TREE_HOUSEHOLDER); PLASMA_Set(PLASMA_HOUSEHOLDER_SIZE, rh); } PLASMA_Alloc_Workspace_cgels(M, N, &T); eps = BLAS_sfpinfo( blas_eps ); /*---------------------------------------------------------- * TESTING CGELS */ /* Initialize A1 and A2 */ LAPACKE_clarnv_work(IONE, ISEED, LDAxN, A1); for (i = 0; i < M; i++) for (j = 0; j < N; j++) A2[LDA*j+i] = A1[LDA*j+i] ; /* Initialize B1 and B2 */ LAPACKE_clarnv_work(IONE, ISEED, LDBxNRHS, B1); for (i = 0; i < M; i++) for (j = 0; j < NRHS; j++) B2[LDB*j+i] = B1[LDB*j+i] ; memset((void*)Q, 0, LDA*N*sizeof(PLASMA_Complex32_t)); for (i = 0; i < K; i++) Q[LDA*i+i] = 1.0; /* PLASMA CGELS */ PLASMA_cgels(PlasmaNoTrans, M, N, NRHS, A2, LDA, T, B2, LDB); /* PLASMA CGELS */ if (M >= N) /* Building the economy-size Q */ PLASMA_cungqr(M, N, K, A2, LDA, T, Q, LDA); else /* Building the economy-size Q */ PLASMA_cunglq(M, N, K, A2, LDA, T, Q, LDA); printf("\n"); printf("------ TESTS FOR PLASMA CGELS ROUTINE ------- \n"); printf(" Size of the Matrix %d by %d\n", M, N); printf("\n"); printf(" The matrix A is randomly generated for each test.\n"); printf("============\n"); printf(" The relative machine precision (eps) is to be %e \n",eps); printf(" Computational tests pass if scaled residuals are less than 60.\n"); /* Check the orthogonality, factorization and the solution */ info_ortho = check_orthogonality(M, N, LDA, Q, eps); info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); if ((info_solution == 0)&(info_factorization == 0)&(info_ortho == 0)) { printf("***************************************************\n"); printf(" ---- TESTING CGELS ...................... PASSED !\n"); printf("***************************************************\n"); } else { printf("************************************************\n"); printf(" - TESTING CGELS ... FAILED !\n"); printf("************************************************\n"); } /*------------------------------------------------------------- * TESTING CGEQRF + CGEQRS or CGELQF + CGELQS */ /* Initialize A1 and A2 */ LAPACKE_clarnv_work(IONE, ISEED, LDAxN, A1); for (i = 0; i < M; i++) for (j = 0; j < N; j++) A2[LDA*j+i] = A1[LDA*j+i]; /* Initialize B1 and B2 */ LAPACKE_clarnv_work(IONE, ISEED, LDBxNRHS, B1); for (i = 0; i < M; i++) for (j = 0; j < NRHS; j++) B2[LDB*j+i] = B1[LDB*j+i]; memset((void*)Q, 0, LDA*N*sizeof(PLASMA_Complex32_t)); for (i = 0; i < K; i++) Q[LDA*i+i] = 1.0; if (M >= N) { printf("\n"); printf("------ TESTS FOR PLASMA CGEQRF + CGEQRS ROUTINE ------- \n"); printf(" Size of the Matrix %d by %d\n", M, N); printf("\n"); printf(" The matrix A is randomly generated for each test.\n"); printf("============\n"); printf(" The relative machine precision (eps) is to be %e \n", eps); printf(" Computational tests pass if scaled residuals are less than 60.\n"); /* Plasma routines */ PLASMA_cgeqrf(M, N, A2, LDA, T); PLASMA_cungqr(M, N, K, A2, LDA, T, Q, LDA); PLASMA_cgeqrs(M, N, NRHS, A2, LDA, T, B2, LDB); /* Check the orthogonality, factorization and the solution */ info_ortho = check_orthogonality(M, N, LDA, Q, eps); info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); if ((info_solution == 0)&(info_factorization == 0)&(info_ortho == 0)) { printf("***************************************************\n"); printf(" ---- TESTING CGEQRF + CGEQRS ............ PASSED !\n"); printf("***************************************************\n"); } else{ printf("***************************************************\n"); printf(" - TESTING CGEQRF + CGEQRS ... FAILED !\n"); printf("***************************************************\n"); } } else { printf("\n"); printf("------ TESTS FOR PLASMA CGELQF + CGELQS ROUTINE ------- \n"); printf(" Size of the Matrix %d by %d\n", M, N); printf("\n"); printf(" The matrix A is randomly generated for each test.\n"); printf("============\n"); printf(" The relative machine precision (eps) is to be %e \n", eps); printf(" Computational tests pass if scaled residuals are less than 60.\n"); /* Plasma routines */ PLASMA_cgelqf(M, N, A2, LDA, T); PLASMA_cunglq(M, N, K, A2, LDA, T, Q, LDA); PLASMA_cgelqs(M, N, NRHS, A2, LDA, T, B2, LDB); /* Check the orthogonality, factorization and the solution */ info_ortho = check_orthogonality(M, N, LDA, Q, eps); info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); if ( (info_solution == 0) & (info_factorization == 0) & (info_ortho == 0) ) { printf("***************************************************\n"); printf(" ---- TESTING CGELQF + CGELQS ............ PASSED !\n"); printf("***************************************************\n"); } else { printf("***************************************************\n"); printf(" - TESTING CGELQF + CGELQS ... FAILED !\n"); printf("***************************************************\n"); } } /*---------------------------------------------------------- * TESTING CGEQRF + ZORMQR + CTRSM */ /* Initialize A1 and A2 */ LAPACKE_clarnv_work(IONE, ISEED, LDAxN, A1); for (i = 0; i < M; i++) for (j = 0; j < N; j++) A2[LDA*j+i] = A1[LDA*j+i]; /* Initialize B1 and B2 */ memset(B2, 0, LDB*NRHS*sizeof(PLASMA_Complex32_t)); LAPACKE_clarnv_work(IONE, ISEED, LDBxNRHS, B1); for (i = 0; i < M; i++) for (j = 0; j < NRHS; j++) B2[LDB*j+i] = B1[LDB*j+i]; /* PLASMA CGEQRF+ CUNMQR + CTRSM */ memset((void*)Q, 0, LDA*N*sizeof(PLASMA_Complex32_t)); for (i = 0; i < K; i++) Q[LDA*i+i] = 1.0; if (M >= N) { printf("\n"); printf("------ TESTS FOR PLASMA CGEQRF + CUNMQR + CTRSM ROUTINE ------- \n"); printf(" Size of the Matrix %d by %d\n", M, N); printf("\n"); printf(" The matrix A is randomly generated for each test.\n"); printf("============\n"); printf(" The relative machine precision (eps) is to be %e \n",eps); printf(" Computational tests pass if scaled residuals are less than 60.\n"); PLASMA_cgeqrf(M, N, A2, LDA, T); PLASMA_cungqr(M, N, K, A2, LDA, T, Q, LDA); PLASMA_cunmqr(PlasmaLeft, PlasmaConjTrans, M, NRHS, N, A2, LDA, T, B2, LDB); PLASMA_ctrsm(PlasmaLeft, PlasmaUpper, PlasmaNoTrans, PlasmaNonUnit, N, NRHS, 1.0, A2, LDA, B2, LDB); } else { printf("\n"); printf("------ TESTS FOR PLASMA CGELQF + CUNMLQ + CTRSM ROUTINE ------- \n"); printf(" Size of the Matrix %d by %d\n", M, N); printf("\n"); printf(" The matrix A is randomly generated for each test.\n"); printf("============\n"); printf(" The relative machine precision (eps) is to be %e \n",eps); printf(" Computational tests pass if scaled residuals are less than 60.\n"); PLASMA_cgelqf(M, N, A2, LDA, T); PLASMA_ctrsm(PlasmaLeft, PlasmaLower, PlasmaNoTrans, PlasmaNonUnit, M, NRHS, 1.0, A2, LDA, B2, LDB); PLASMA_cunglq(M, N, K, A2, LDA, T, Q, LDA); PLASMA_cunmlq(PlasmaLeft, PlasmaConjTrans, N, NRHS, M, A2, LDA, T, B2, LDB); } /* Check the orthogonality, factorization and the solution */ info_ortho = check_orthogonality(M, N, LDA, Q, eps); info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); if ( (info_solution == 0) & (info_factorization == 0) & (info_ortho == 0) ) { if (M >= N) { printf("***************************************************\n"); printf(" ---- TESTING CGEQRF + CUNMQR + CTRSM .... PASSED !\n"); printf("***************************************************\n"); } else { printf("***************************************************\n"); printf(" ---- TESTING CGELQF + CTRSM + CUNMLQ .... PASSED !\n"); printf("***************************************************\n"); } } else { if (M >= N) { printf("***************************************************\n"); printf(" - TESTING CGEQRF + CUNMQR + CTRSM ... FAILED !\n"); printf("***************************************************\n"); } else { printf("***************************************************\n"); printf(" - TESTING CGELQF + CTRSM + CUNMLQ ... FAILED !\n"); printf("***************************************************\n"); } } free(A1); free(A2); free(B1); free(B2); free(Q); free(T); return 0; }