Fix RAP memory leak (#806)

This PR fixes a memory leak in the parallel RAP routine that arises when a single task is used and R contains `diagT` at input.
This commit is contained in:
Victor A. Paludetto Magri 2023-01-05 16:24:06 -05:00 committed by GitHub
parent 79e4ddb5a8
commit 41961c2935
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 28 deletions

View File

@ -623,6 +623,7 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
hypre_ParCSRMatrix *P,
HYPRE_Int keep_transpose )
{
MPI_Comm comm = hypre_ParCSRMatrixComm(A);
hypre_CSRMatrix *R_diag = hypre_ParCSRMatrixDiag(R);
hypre_CSRMatrix *R_offd = hypre_ParCSRMatrixOffd(R);
@ -633,7 +634,7 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
HYPRE_BigInt *col_map_offd_C = NULL;
HYPRE_Int num_procs;
MPI_Comm comm = hypre_ParCSRMatrixComm(A);
hypre_MPI_Comm_size(comm, &num_procs);
if ( hypre_ParCSRMatrixGlobalNumRows(R) != hypre_ParCSRMatrixGlobalNumRows(A) ||
@ -717,12 +718,14 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
hypre_CSRMatrixDestroy(Abar);
hypre_CSRMatrixDestroy(Pbar);
hypre_assert(hypre_CSRMatrixNumRows(Cbar) == hypre_ParCSRMatrixNumCols(R) + hypre_CSRMatrixNumCols(
R_offd));
hypre_assert(hypre_CSRMatrixNumCols(Cbar) == hypre_ParCSRMatrixNumCols(P) + num_cols_offd);
hypre_assert(hypre_CSRMatrixNumRows(Cbar) ==
hypre_ParCSRMatrixNumCols(R) + hypre_CSRMatrixNumCols(R_offd));
hypre_assert(hypre_CSRMatrixNumCols(Cbar) ==
hypre_ParCSRMatrixNumCols(P) + num_cols_offd);
hypre_TMemcpy(&local_nnz_Cbar, hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R), HYPRE_Int, 1,
HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE);
hypre_TMemcpy(&local_nnz_Cbar,
hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R),
HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE);
// Cint is the bottom part of Cbar
Cint = hypre_CSRMatrixCreate(hypre_CSRMatrixNumCols(R_offd), hypre_CSRMatrixNumCols(Cbar),
@ -748,10 +751,12 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
// Change Cint into a BigJ matrix
// RL: TODO FIX the 'big' num of columns to global size
hypre_CSRMatrixBigJ(Cint) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumNonzeros(Cint),
hypre_CSRMatrixBigJ(Cint) = hypre_TAlloc(HYPRE_BigInt,
hypre_CSRMatrixNumNonzeros(Cint),
HYPRE_MEMORY_DEVICE);
RAP_functor<1, HYPRE_BigInt> func1(hypre_ParCSRMatrixNumCols(P), hypre_ParCSRMatrixFirstColDiag(P),
RAP_functor<1, HYPRE_BigInt> func1(hypre_ParCSRMatrixNumCols(P),
hypre_ParCSRMatrixFirstColDiag(P),
col_map_offd);
#if defined(HYPRE_USING_SYCL)
HYPRE_ONEDPL_CALL( std::transform,
@ -780,7 +785,8 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
hypre_TFree(hypre_CSRMatrixBigJ(Cint), HYPRE_MEMORY_DEVICE);
hypre_TFree(Cint, HYPRE_MEMORY_HOST);
hypre_TMemcpy(hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R), &local_nnz_Cbar, HYPRE_Int, 1,
hypre_TMemcpy(hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R),
&local_nnz_Cbar, HYPRE_Int, 1,
HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST);
/* add Cext to local part of Cbar */
@ -806,10 +812,24 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
hypre_CSRMatrix *R_diagT;
hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A);
hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P);
/* Recover or compute transpose of R_diag */
if (hypre_ParCSRMatrixDiagT(R))
{
R_diagT = hypre_ParCSRMatrixDiagT(R);
}
else
{
hypre_CSRMatrixTransposeDevice(R_diag, &R_diagT, 1);
}
C_diag = hypre_CSRMatrixTripleMultiplyDevice(R_diagT, A_diag, P_diag);
C_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumCols(R), 0, 0);
hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE);
/* Keep or destroy transpose of R_diag */
if (!hypre_ParCSRMatrixDiagT(R))
{
if (keep_transpose)
{
hypre_ParCSRMatrixDiagT(R) = R_diagT;
@ -819,6 +839,7 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
hypre_CSRMatrixDestroy(R_diagT);
}
}
}
/* Move the diagonal entry to the first of each row */
hypre_CSRMatrixMoveDiagFirstDevice(C_diag);
@ -842,9 +863,11 @@ hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R,
{
hypre_ParCSRMatrixDeviceColMapOffd(C) = col_map_offd_C;
hypre_ParCSRMatrixColMapOffd(C) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST);
hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(C), col_map_offd_C, HYPRE_BigInt, num_cols_offd_C,
HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE);
hypre_ParCSRMatrixColMapOffd(C) = hypre_TAlloc(HYPRE_BigInt,
num_cols_offd_C,
HYPRE_MEMORY_HOST);
hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(C), col_map_offd_C, HYPRE_BigInt,
num_cols_offd_C, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE);
}
hypre_assert(!hypre_CSRMatrixCheckDiagFirstDevice(hypre_ParCSRMatrixDiag(C)));