update driver

This commit is contained in:
Ruipeng Li 2022-04-07 13:11:32 -07:00
parent 4421ebd83a
commit 4025b32ad8

View File

@ -101,7 +101,7 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Int rep,
HYPRE_Int verify)
{
HYPRE_Int num_procs, myid, i;
HYPRE_Int i;
HYPRE_ParCSRMatrix parcsr_A_host = NULL;
HYPRE_ParCSRMatrix parcsr_B_host = NULL;
HYPRE_ParCSRMatrix parcsr_B_host2 = NULL;
@ -111,16 +111,12 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Int time_index;
char fname[1024];
hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs );
hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid );
MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A);
if (myid == 0)
{
hypre_printf("A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParPrintf(comm, "A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParCSRMatrixGlobalNumCols(parcsr_A),
hypre_ParCSRMatrixNumNonzeros(parcsr_A),
hypre_ParCSRMatrixNumNonzeros(parcsr_A) / hypre_ParCSRMatrixGlobalNumRows(parcsr_A));
}
hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE);
@ -160,10 +156,8 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
for (i = 0 ; i < rep; i++)
{
if (myid == 0)
{
hypre_printf("--- rep %d (out of %d) ---\n", i, rep);
}
hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep);
if (i == rep - 1)
{
time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, A*A");
@ -199,15 +193,12 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_B_host);
rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm;
if (myid == 0)
{
hypre_printf("A^2: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n",
hypre_ParPrintf(comm, "A^2: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n",
hypre_ParCSRMatrixGlobalNumRows(parcsr_B_host2),
hypre_ParCSRMatrixGlobalNumCols(parcsr_B_host2),
hypre_ParCSRMatrixNumNonzeros(parcsr_B_host),
hypre_ParCSRMatrixNumNonzeros(parcsr_B_host2),
rfnorm);
}
}
if (print_system)
@ -224,13 +215,10 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
hypre_ParCSRMatrixSetNumNonzeros(parcsr_B);
if (myid == 0)
{
hypre_printf("B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B),
hypre_ParPrintf(comm, "B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B),
hypre_ParCSRMatrixGlobalNumCols(parcsr_B),
hypre_ParCSRMatrixNumNonzeros(parcsr_B),
hypre_ParCSRMatrixNumNonzeros(parcsr_B) / hypre_ParCSRMatrixGlobalNumRows(parcsr_B));
}
hypre_ParCSRMatrixDestroy(parcsr_B);
hypre_ParCSRMatrixDestroy(parcsr_A_host);
@ -243,7 +231,7 @@ void runjob2( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Int rep,
HYPRE_Int verify)
{
HYPRE_Int num_procs, myid, i;
HYPRE_Int i;
HYPRE_ParCSRMatrix parcsr_A_host = NULL;
HYPRE_ParCSRMatrix parcsr_B_host = NULL;
HYPRE_ParCSRMatrix parcsr_B_host2 = NULL;
@ -253,16 +241,12 @@ void runjob2( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Int time_index;
char fname[1024];
hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs );
hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid );
MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A);
if (myid == 0)
{
hypre_printf("A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParPrintf(comm, "A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParCSRMatrixGlobalNumCols(parcsr_A),
hypre_ParCSRMatrixNumNonzeros(parcsr_A),
hypre_ParCSRMatrixNumNonzeros(parcsr_A) / hypre_ParCSRMatrixGlobalNumRows(parcsr_A));
}
hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE);
@ -300,10 +284,8 @@ void runjob2( HYPRE_ParCSRMatrix parcsr_A,
for (i = 0 ; i < rep; i++)
{
if (myid == 0)
{
hypre_printf("--- rep %d (out of %d) ---\n", i, rep);
}
hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep);
if (i == rep - 1)
{
time_index = hypre_InitializeTiming("Device Parcsr Matrix-Transpose-by-Matrix, AT*A");
@ -339,15 +321,12 @@ void runjob2( HYPRE_ParCSRMatrix parcsr_A,
fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_B_host);
rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm;
if (myid == 0)
{
hypre_printf("A^T*A: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n",
hypre_ParPrintf(comm, "A^T*A: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n",
hypre_ParCSRMatrixGlobalNumRows(parcsr_B_host2),
hypre_ParCSRMatrixGlobalNumCols(parcsr_B_host2),
hypre_ParCSRMatrixNumNonzeros(parcsr_B_host),
hypre_ParCSRMatrixNumNonzeros(parcsr_B_host2),
rfnorm);
}
}
if (print_system)
@ -364,13 +343,10 @@ void runjob2( HYPRE_ParCSRMatrix parcsr_A,
hypre_ParCSRMatrixSetNumNonzeros(parcsr_B);
if (myid == 0)
{
hypre_printf("B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B),
hypre_ParPrintf(comm, "B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B),
hypre_ParCSRMatrixGlobalNumCols(parcsr_B),
hypre_ParCSRMatrixNumNonzeros(parcsr_B),
hypre_ParCSRMatrixNumNonzeros(parcsr_B) / hypre_ParCSRMatrixGlobalNumRows(parcsr_B));
}
hypre_ParCSRMatrixDestroy(parcsr_B);
hypre_ParCSRMatrixDestroy(parcsr_A_host);
@ -386,7 +362,7 @@ void runjob3( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Int rep,
HYPRE_Int verify)
{
HYPRE_Int num_procs, myid, i;
HYPRE_Int i;
char fname[1024];
HYPRE_Int time_index;
HYPRE_Int keepTranspose = 0;
@ -402,16 +378,12 @@ void runjob3( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_ParCSRMatrix parcsr_AH_host_2 = NULL;
HYPRE_ParCSRMatrix parcsr_error_host = NULL;
hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs );
hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid );
MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A);
if (myid == 0)
{
hypre_printf("A %d x %d, NNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParPrintf(comm, "A %d x %d, NNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParCSRMatrixGlobalNumCols(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A));
hypre_printf("P %d x %d, NNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_P),
hypre_ParPrintf(comm, "P %d x %d, NNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_P),
hypre_ParCSRMatrixGlobalNumCols(parcsr_P), hypre_ParCSRMatrixNumNonzeros(parcsr_P));
}
/* !!! */
hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE);
@ -472,10 +444,8 @@ void runjob3( HYPRE_ParCSRMatrix parcsr_A,
/* run for a second time for timing */
for (i = 0 ; i < rep; i++)
{
if (myid == 0)
{
hypre_printf("--- rep %d (out of %d) ---\n", i, rep);
}
hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep);
if (i == rep - 1)
{
time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, RAP2");
@ -531,14 +501,11 @@ void runjob3( HYPRE_ParCSRMatrix parcsr_A,
fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_AH_host);
rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm;
if (myid == 0)
{
hypre_printf("AH: %d x %d, nnz %d, CPU-GPU err %e\n",
hypre_ParPrintf(comm, "AH: %d x %d, nnz %d, CPU-GPU err %e\n",
hypre_ParCSRMatrixGlobalNumRows(parcsr_AH_host_2),
hypre_ParCSRMatrixGlobalNumCols(parcsr_AH_host_2),
hypre_ParCSRMatrixNumNonzeros(parcsr_AH_host_2),
rfnorm);
}
}
hypre_ParCSRMatrixDestroy(parcsr_Q);
@ -565,7 +532,6 @@ void runjob4( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Real strong_threshold = 0.25;
HYPRE_Real max_row_sum = 1.0;
HYPRE_Int local_num_vars, coarse_pnts_global[2];
HYPRE_Int num_procs, myid;
HYPRE_Int time_index, i;
char fname[1024];
@ -573,9 +539,6 @@ void runjob4( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_ParCSRMatrix parcsr_S = NULL;
HYPRE_ParCSRMatrix parcsr_P = NULL;
hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs );
hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid );
/* coarsening */
hypre_BoomerAMGCreateS(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S);
@ -599,6 +562,168 @@ void runjob4( HYPRE_ParCSRMatrix parcsr_A,
hypre_ParCSRMatrixDestroy(parcsr_P);
}
void runjob5( HYPRE_ParCSRMatrix parcsr_A,
HYPRE_Int print_system,
HYPRE_Int rep,
HYPRE_Int verify)
{
HYPRE_Int i;
HYPRE_ParCSRMatrix parcsr_B = NULL;
HYPRE_ParCSRMatrix parcsr_A_host = NULL;
HYPRE_ParCSRMatrix parcsr_B_host = NULL;
HYPRE_ParCSRMatrix parcsr_error_host = NULL;
HYPRE_Real fnorm, rfnorm, fnorm0;
HYPRE_Int time_index;
char fname[1024];
MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A);
hypre_ParPrintf(comm, "A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParCSRMatrixGlobalNumCols(parcsr_A),
hypre_ParCSRMatrixNumNonzeros(parcsr_A),
hypre_ParCSRMatrixNumNonzeros(parcsr_A) / hypre_ParCSRMatrixGlobalNumRows(parcsr_A));
hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE);
// D = diag(diag(A))
HYPRE_ParCSRMatrix parcsr_D = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(parcsr_A),
hypre_ParCSRMatrixGlobalNumRows(parcsr_A),
hypre_ParCSRMatrixGlobalNumCols(parcsr_A),
hypre_ParCSRMatrixRowStarts(parcsr_A),
hypre_ParCSRMatrixColStarts(parcsr_A),
0,
hypre_ParCSRMatrixNumRows(parcsr_A),
0);
hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(parcsr_D));
hypre_ParCSRMatrixDiag(parcsr_D) = hypre_CSRMatrixDiagMatrixFromMatrixDevice(hypre_ParCSRMatrixDiag(parcsr_A), 0);
// Diag Scale on host
if (verify)
{
parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST);
hypre_Vector *vec_d_host = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(parcsr_A_host));
hypre_SeqVectorInitialize_v2(vec_d_host, HYPRE_MEMORY_HOST);
hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(parcsr_A_host),
hypre_VectorData(vec_d_host), 0);
time_index = hypre_InitializeTiming("Host Parcsr Diag-by-Matrix, Diag(A)*A");
hypre_BeginTiming(time_index);
hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixDiag(parcsr_A_host), vec_d_host, NULL);
hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixOffd(parcsr_A_host), vec_d_host, NULL);
hypre_EndTiming(time_index);
hypre_PrintTiming("Host Parcsr Diag-by-Matrix, Diag(A)*A", hypre_MPI_COMM_WORLD);
hypre_FinalizeTiming(time_index);
hypre_ClearTiming();
hypre_SeqVectorDestroy(vec_d_host);
}
// [SLOW] Diag-by-Matrix
for (i = 0 ; i < rep; i++)
{
hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep);
if (i == rep - 1)
{
time_index = hypre_InitializeTiming("Device Parcsr Diag-by-Matrix, Diag(A)*A");
hypre_BeginTiming(time_index);
}
parcsr_B = hypre_ParCSRMatMat(parcsr_D, parcsr_A);
if (i == rep - 1)
{
hypre_SyncCudaDevice(hypre_handle());
hypre_EndTiming(time_index);
hypre_PrintTiming("Device Parcsr Diag-by-Matrix, Diag(A)*A", hypre_MPI_COMM_WORLD);
hypre_FinalizeTiming(time_index);
hypre_ClearTiming();
}
if (i < rep - 1)
{
hypre_ParCSRMatrixDestroy(parcsr_B);
}
}
if (verify)
{
parcsr_B_host = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST);
hypre_ParCSRMatrixSetNumNonzeros(parcsr_B_host);
hypre_ParCSRMatrixAdd(1.0, parcsr_A_host, -1.0, parcsr_B_host, &parcsr_error_host);
fnorm = hypre_ParCSRMatrixFnorm(parcsr_error_host);
fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_B_host);
rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm;
hypre_ParPrintf(comm, "Diag(A)*A: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n",
hypre_ParCSRMatrixGlobalNumRows(parcsr_B_host),
hypre_ParCSRMatrixGlobalNumCols(parcsr_B_host),
hypre_ParCSRMatrixNumNonzeros(parcsr_A_host),
hypre_ParCSRMatrixNumNonzeros(parcsr_B_host),
rfnorm);
}
// [FAST] diag scale using vector
{
HYPRE_ParCSRMatrix parcsr_C = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_DEVICE);
hypre_Vector *vec_d = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(parcsr_C));
hypre_SeqVectorInitialize_v2(vec_d, HYPRE_MEMORY_DEVICE);
hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(parcsr_C),
hypre_VectorData(vec_d), 0);
for (i = 0 ; i < rep; i++)
{
if (i == rep - 1)
{
time_index = hypre_InitializeTiming("Device Parcsr DiagScale Matrix");
hypre_BeginTiming(time_index);
}
hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixDiag(parcsr_C), vec_d, NULL);
hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixOffd(parcsr_C), vec_d, NULL);
if (i == rep - 1)
{
hypre_SyncCudaDevice(hypre_handle());
hypre_EndTiming(time_index);
hypre_PrintTiming("Device Parcsr DiagScale Matrix", hypre_MPI_COMM_WORLD);
hypre_FinalizeTiming(time_index);
hypre_ClearTiming();
}
}
hypre_ParCSRMatrixDestroy(parcsr_C);
hypre_SeqVectorDestroy(vec_d);
}
if (print_system)
{
if (!parcsr_B_host)
{
parcsr_B_host = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST);
}
sprintf(fname, "%s/%s", file_dir, "IJ.out.B");
hypre_ParCSRMatrixPrintIJ(parcsr_B_host, 0, 0, fname);
}
hypre_ParCSRMatrixSetNumNonzeros(parcsr_B);
hypre_ParPrintf(comm, "B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B),
hypre_ParCSRMatrixGlobalNumCols(parcsr_B),
hypre_ParCSRMatrixNumNonzeros(parcsr_B),
hypre_ParCSRMatrixNumNonzeros(parcsr_B) / hypre_ParCSRMatrixGlobalNumRows(parcsr_B));
hypre_ParCSRMatrixDestroy(parcsr_B);
hypre_ParCSRMatrixDestroy(parcsr_A_host);
hypre_ParCSRMatrixDestroy(parcsr_B_host);
hypre_ParCSRMatrixDestroy(parcsr_D);
}
hypre_int
main( hypre_int argc,
char *argv[] )
@ -811,6 +936,10 @@ main( hypre_int argc,
arg_index++;
zero_mem_cost = atoi(argv[arg_index++]);
}
else if ( strcmp(argv[arg_index], "-help") == 0 )
{
print_usage = 1;
}
else
{
arg_index++;
@ -863,7 +992,9 @@ main( hypre_int argc,
hypre_printf("\n");
hypre_printf(" -concrete_parcsr : use parcsr matrix type as concrete type\n");
hypre_printf("\n");
hypre_printf(" -job : 1. A^2; 2. A^T*A; 3. P^T*A*P; 4. P^T*A*P, P is AMG Interp. from A \n");
hypre_printf(" -job : 1. A^2 2. A^T*A 3. P^T*A*P\n");
hypre_printf(" 4. P^T*A*P (P is AMG Interp from A)\n");
hypre_printf(" 5. Diag(A) * A\n");
}
goto final;
}
@ -1019,6 +1150,10 @@ main( hypre_int argc,
{
runjob4(parcsr_A, print_system, mult_order, rep, verify);
}
else if (job == 5)
{
runjob5(parcsr_A, print_system, rep, verify);
}
/*-----------------------------------------------------------
* Finalize things