hypre_ParCSRMatrixPrintIJ on device (#655)

hypre_ParCSRMatrixPrintIJ works for matrices living on the device w/o the need of UVM support. A explicit copy is to host memory is performed in this function prior to printing the files.
This commit is contained in:
Victor A. Paludetto Magri 2022-06-22 17:49:57 -07:00 committed by GitHub
parent 850fd47d07
commit 8268b9f1e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 34 deletions

View File

@ -1097,20 +1097,9 @@ HYPRE_IJMatrixPrint( HYPRE_IJMatrix matrix,
void *object; void *object;
HYPRE_IJMatrixGetObject(matrix, &object); HYPRE_IJMatrixGetObject(matrix, &object);
HYPRE_ParCSRMatrix par_csr = (HYPRE_ParCSRMatrix) object; hypre_ParCSRMatrix *par_csr = (hypre_ParCSRMatrix*) object;
HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(matrix); hypre_ParCSRMatrixPrintIJ(par_csr, 0, 0, filename);
if ( hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_HOST )
{
hypre_ParCSRMatrixPrintIJ(par_csr, 0, 0, filename);
}
else
{
HYPRE_ParCSRMatrix par_csr2 = hypre_ParCSRMatrixClone_v2(par_csr, 1, HYPRE_MEMORY_HOST);
hypre_ParCSRMatrixPrintIJ(par_csr2, 0, 0, filename);
hypre_ParCSRMatrixDestroy(par_csr2);
}
return hypre_error_flag; return hypre_error_flag;
} }

View File

@ -516,7 +516,6 @@ hypre_ParCSRMatrixRead( MPI_Comm comm,
{ {
offd = hypre_CSRMatrixCreate(local_num_rows, 0, 0); offd = hypre_CSRMatrixCreate(local_num_rows, 0, 0);
hypre_CSRMatrixInitialize_v2(offd, 0, HYPRE_MEMORY_HOST); hypre_CSRMatrixInitialize_v2(offd, 0, HYPRE_MEMORY_HOST);
} }
matrix = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); matrix = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST);
@ -624,6 +623,8 @@ hypre_ParCSRMatrixPrintIJ( const hypre_ParCSRMatrix *matrix,
const HYPRE_Int base_j, const HYPRE_Int base_j,
const char *filename ) const char *filename )
{ {
hypre_ParCSRMatrix *h_matrix;
MPI_Comm comm; MPI_Comm comm;
HYPRE_BigInt first_row_index; HYPRE_BigInt first_row_index;
HYPRE_BigInt first_col_diag; HYPRE_BigInt first_col_diag;
@ -646,21 +647,33 @@ hypre_ParCSRMatrixPrintIJ( const hypre_ParCSRMatrix *matrix,
HYPRE_Int num_nonzeros_offd; HYPRE_Int num_nonzeros_offd;
HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_BigInt ilower, iupper, jlower, jupper;
HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation((hypre_ParCSRMatrix*) matrix);
if (!matrix) if (!matrix)
{ {
hypre_error_in_arg(1); hypre_error_in_arg(1);
return hypre_error_flag; return hypre_error_flag;
} }
comm = hypre_ParCSRMatrixComm(matrix); /* Create temporary matrix on host memory if needed */
first_row_index = hypre_ParCSRMatrixFirstRowIndex(matrix); if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_HOST)
first_col_diag = hypre_ParCSRMatrixFirstColDiag(matrix); {
diag = hypre_ParCSRMatrixDiag(matrix); h_matrix = (hypre_ParCSRMatrix *) matrix;
offd = hypre_ParCSRMatrixOffd(matrix); }
col_map_offd = hypre_ParCSRMatrixColMapOffd(matrix); else
num_rows = hypre_ParCSRMatrixNumRows(matrix); {
row_starts = hypre_ParCSRMatrixRowStarts(matrix); h_matrix = hypre_ParCSRMatrixClone_v2((hypre_ParCSRMatrix *) matrix, 1, HYPRE_MEMORY_HOST);
col_starts = hypre_ParCSRMatrixColStarts(matrix); }
comm = hypre_ParCSRMatrixComm(h_matrix);
first_row_index = hypre_ParCSRMatrixFirstRowIndex(h_matrix);
first_col_diag = hypre_ParCSRMatrixFirstColDiag(h_matrix);
diag = hypre_ParCSRMatrixDiag(h_matrix);
offd = hypre_ParCSRMatrixOffd(h_matrix);
col_map_offd = hypre_ParCSRMatrixColMapOffd(h_matrix);
num_rows = hypre_ParCSRMatrixNumRows(h_matrix);
row_starts = hypre_ParCSRMatrixRowStarts(h_matrix);
col_starts = hypre_ParCSRMatrixColStarts(h_matrix);
hypre_MPI_Comm_rank(comm, &myid); hypre_MPI_Comm_rank(comm, &myid);
hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_size(comm, &num_procs);
@ -739,6 +752,12 @@ hypre_ParCSRMatrixPrintIJ( const hypre_ParCSRMatrix *matrix,
fclose(file); fclose(file);
/* Free temporary matrix */
if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST)
{
hypre_ParCSRMatrixDestroy(h_matrix);
}
return hypre_error_flag; return hypre_error_flag;
} }

View File

@ -140,12 +140,8 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
if (print_system) if (print_system)
{ {
if (!parcsr_A_host)
{
parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST);
}
sprintf(fname, "%s/%s", file_dir, "IJ.out.A"); sprintf(fname, "%s/%s", file_dir, "IJ.out.A");
hypre_ParCSRMatrixPrintIJ(parcsr_A_host, 0, 0, fname); hypre_ParCSRMatrixPrintIJ(parcsr_A, 0, 0, fname);
} }
for (i = 0 ; i < rep; i++) for (i = 0 ; i < rep; i++)
@ -196,12 +192,8 @@ void runjob1( HYPRE_ParCSRMatrix parcsr_A,
if (print_system) if (print_system)
{ {
if (!parcsr_B_host2)
{
parcsr_B_host2 = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST);
}
sprintf(fname, "%s/%s", file_dir, "IJ.out.B"); sprintf(fname, "%s/%s", file_dir, "IJ.out.B");
hypre_ParCSRMatrixPrintIJ(parcsr_B_host2, 0, 0, fname); hypre_ParCSRMatrixPrintIJ(parcsr_B, 0, 0, fname);
} }
hypre_ParCSRMatrixDestroy(parcsr_B); hypre_ParCSRMatrixDestroy(parcsr_B);

View File

@ -691,7 +691,6 @@ main( hypre_int argc,
else else
{ {
hypre_MGRBuildPDevice(parcsr_A, hypre_IntArrayData(CF_marker), coarse_pnts_global, 2, &P); hypre_MGRBuildPDevice(parcsr_A, hypre_IntArrayData(CF_marker), coarse_pnts_global, 2, &P);
hypre_ParCSRMatrixMigrate(P, HYPRE_MEMORY_HOST);
hypre_ParCSRMatrixPrintIJ(P, 0, 0, "P_device"); hypre_ParCSRMatrixPrintIJ(P, 0, 0, "P_device");
} }
#endif #endif