xref: /petsc/src/mat/impls/dense/mpi/cupm/cuda/matmpidensecuda.cu (revision d0b3cce3968ed23450689940f4aaa7d58fe0cffb)
14742e46bSJacob Faibussowitsch #include "../matmpidensecupm.hpp"
24742e46bSJacob Faibussowitsch 
34742e46bSJacob Faibussowitsch using namespace Petsc::mat::cupm;
44742e46bSJacob Faibussowitsch using Petsc::device::cupm::DeviceType;
54742e46bSJacob Faibussowitsch 
64742e46bSJacob Faibussowitsch static constexpr impl::MatDense_MPI_CUPM<DeviceType::CUDA> mat_cupm{};
74742e46bSJacob Faibussowitsch 
84742e46bSJacob Faibussowitsch /*MC
94742e46bSJacob Faibussowitsch   MATDENSECUDA - "densecuda" - A matrix type to be used for dense matrices on GPUs.
104742e46bSJacob Faibussowitsch 
114742e46bSJacob Faibussowitsch   This matrix type is identical to `MATSEQDENSECUDA` when constructed with a single process
124742e46bSJacob Faibussowitsch   communicator, and `MATMPIDENSECUDA` otherwise.
134742e46bSJacob Faibussowitsch 
144742e46bSJacob Faibussowitsch   Options Database Key:
154742e46bSJacob Faibussowitsch . -mat_type densecuda - sets the matrix type to `MATDENSECUDA` during a call to
164742e46bSJacob Faibussowitsch                         `MatSetFromOptions()`
174742e46bSJacob Faibussowitsch 
184742e46bSJacob Faibussowitsch   Level: beginner
194742e46bSJacob Faibussowitsch 
201cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, `MATSEQDENSECUDA`, `MATMPIDENSECUDA`, `MATSEQDENSEHIP`,
214742e46bSJacob Faibussowitsch `MATMPIDENSEHIP`, `MATDENSE`
224742e46bSJacob Faibussowitsch M*/
234742e46bSJacob Faibussowitsch 
244742e46bSJacob Faibussowitsch /*MC
254742e46bSJacob Faibussowitsch   MATMPIDENSECUDA - "mpidensecuda" - A matrix type to be used for distributed dense matrices on
264742e46bSJacob Faibussowitsch   GPUs.
274742e46bSJacob Faibussowitsch 
284742e46bSJacob Faibussowitsch   Options Database Key:
294742e46bSJacob Faibussowitsch . -mat_type mpidensecuda - sets the matrix type to `MATMPIDENSECUDA` during a call to
304742e46bSJacob Faibussowitsch                            `MatSetFromOptions()`
314742e46bSJacob Faibussowitsch 
324742e46bSJacob Faibussowitsch   Level: beginner
334742e46bSJacob Faibussowitsch 
341cc06b55SBarry Smith .seealso: [](ch_matrices), `Mat`, `MATDENSECUDA`, `MATMPIDENSE`, `MATSEQDENSE`,
354742e46bSJacob Faibussowitsch `MATSEQDENSECUDA`, `MATSEQDENSEHIP`
364742e46bSJacob Faibussowitsch M*/
MatCreate_MPIDenseCUDA(Mat A)374742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatCreate_MPIDenseCUDA(Mat A)
384742e46bSJacob Faibussowitsch {
394742e46bSJacob Faibussowitsch   PetscFunctionBegin;
404742e46bSJacob Faibussowitsch   PetscCall(mat_cupm.Create(A));
414742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
424742e46bSJacob Faibussowitsch }
434742e46bSJacob Faibussowitsch 
MatConvert_MPIDense_MPIDenseCUDA(Mat A,MatType type,MatReuse reuse,Mat * ret)444742e46bSJacob Faibussowitsch PetscErrorCode MatConvert_MPIDense_MPIDenseCUDA(Mat A, MatType type, MatReuse reuse, Mat *ret)
454742e46bSJacob Faibussowitsch {
464742e46bSJacob Faibussowitsch   PetscFunctionBegin;
474742e46bSJacob Faibussowitsch   PetscCall(mat_cupm.Convert_MPIDense_MPIDenseCUPM(A, type, reuse, ret));
484742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
494742e46bSJacob Faibussowitsch }
504742e46bSJacob Faibussowitsch 
514742e46bSJacob Faibussowitsch /*@C
524742e46bSJacob Faibussowitsch   MatCreateDenseCUDA - Creates a matrix in `MATDENSECUDA` format using CUDA.
534742e46bSJacob Faibussowitsch 
544742e46bSJacob Faibussowitsch   Collective
554742e46bSJacob Faibussowitsch 
564742e46bSJacob Faibussowitsch   Input Parameters:
574742e46bSJacob Faibussowitsch + comm - MPI communicator
584742e46bSJacob Faibussowitsch . m    - number of local rows (or `PETSC_DECIDE` to have calculated if `M` is given)
594742e46bSJacob Faibussowitsch . n    - number of local columns (or `PETSC_DECIDE` to have calculated if `N` is given)
604742e46bSJacob Faibussowitsch . M    - number of global rows (or `PETSC_DECIDE` to have calculated if `m` is given)
614742e46bSJacob Faibussowitsch . N    - number of global columns (or `PETSC_DECIDE` to have calculated if `n` is given)
622fe279fdSBarry Smith - data - optional location of GPU matrix data. Pass `NULL` to have PETSc to control matrix memory allocation.
634742e46bSJacob Faibussowitsch 
644742e46bSJacob Faibussowitsch   Output Parameter:
654742e46bSJacob Faibussowitsch . A - the matrix
664742e46bSJacob Faibussowitsch 
674742e46bSJacob Faibussowitsch   Level: intermediate
684742e46bSJacob Faibussowitsch 
694742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatCreate()`, `MatCreateDense()`
704742e46bSJacob Faibussowitsch @*/
MatCreateDenseCUDA(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscScalar * data,Mat * A)714742e46bSJacob Faibussowitsch PetscErrorCode MatCreateDenseCUDA(MPI_Comm comm, PetscInt m, PetscInt n, PetscInt M, PetscInt N, PetscScalar *data, Mat *A)
724742e46bSJacob Faibussowitsch {
734742e46bSJacob Faibussowitsch   PetscFunctionBegin;
744742e46bSJacob Faibussowitsch   PetscCall(MatCreateDenseCUPM<DeviceType::CUDA>(comm, m, n, M, N, data, A));
754742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
764742e46bSJacob Faibussowitsch }
774742e46bSJacob Faibussowitsch 
784742e46bSJacob Faibussowitsch /*@C
794742e46bSJacob Faibussowitsch   MatDenseCUDAPlaceArray - Allows one to replace the GPU array in a `MATDENSECUDA` matrix with an
804742e46bSJacob Faibussowitsch   array provided by the user. This is useful to avoid copying an array into a matrix.
814742e46bSJacob Faibussowitsch 
824742e46bSJacob Faibussowitsch   Not Collective
834742e46bSJacob Faibussowitsch 
844742e46bSJacob Faibussowitsch   Input Parameters:
854742e46bSJacob Faibussowitsch + mat   - the matrix
864742e46bSJacob Faibussowitsch - array - the array in column major order
874742e46bSJacob Faibussowitsch 
884742e46bSJacob Faibussowitsch   Level: developer
894742e46bSJacob Faibussowitsch 
904742e46bSJacob Faibussowitsch   Note:
91*4d5500e8SJunchao Zhang   Adding `const` to `array` was an oversight, see notes in `VecPlaceArray()`.
92*4d5500e8SJunchao Zhang 
934742e46bSJacob Faibussowitsch   You can return to the original array with a call to `MatDenseCUDAResetArray()`. The user is
944742e46bSJacob Faibussowitsch   responsible for freeing this array; it will not be freed when the matrix is destroyed. The
954742e46bSJacob Faibussowitsch   array must have been allocated with `cudaMalloc()`.
964742e46bSJacob Faibussowitsch 
974742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDAResetArray()`,
984742e46bSJacob Faibussowitsch           `MatDenseCUDAReplaceArray()`
994742e46bSJacob Faibussowitsch @*/
MatDenseCUDAPlaceArray(Mat mat,const PetscScalar * array)1004742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDAPlaceArray(Mat mat, const PetscScalar *array)
1014742e46bSJacob Faibussowitsch {
1024742e46bSJacob Faibussowitsch   PetscFunctionBegin;
1034742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMPlaceArray<DeviceType::CUDA>(mat, array));
1044742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1054742e46bSJacob Faibussowitsch }
1064742e46bSJacob Faibussowitsch 
1074742e46bSJacob Faibussowitsch /*@C
1084742e46bSJacob Faibussowitsch   MatDenseCUDAResetArray - Resets the matrix array to that it previously had before the call to
1094742e46bSJacob Faibussowitsch   `MatDenseCUDAPlaceArray()`
1104742e46bSJacob Faibussowitsch 
1114742e46bSJacob Faibussowitsch   Not Collective
1124742e46bSJacob Faibussowitsch 
1132fe279fdSBarry Smith   Input Parameter:
1144742e46bSJacob Faibussowitsch . mat - the matrix
1154742e46bSJacob Faibussowitsch 
1164742e46bSJacob Faibussowitsch   Level: developer
1174742e46bSJacob Faibussowitsch 
1184742e46bSJacob Faibussowitsch   Note:
1194742e46bSJacob Faibussowitsch   You can only call this after a call to `MatDenseCUDAPlaceArray()`
1204742e46bSJacob Faibussowitsch 
1214742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDAPlaceArray()`
1224742e46bSJacob Faibussowitsch @*/
MatDenseCUDAResetArray(Mat mat)1234742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDAResetArray(Mat mat)
1244742e46bSJacob Faibussowitsch {
1254742e46bSJacob Faibussowitsch   PetscFunctionBegin;
1264742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMResetArray<DeviceType::CUDA>(mat));
1274742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1284742e46bSJacob Faibussowitsch }
1294742e46bSJacob Faibussowitsch 
1304742e46bSJacob Faibussowitsch /*@C
1314742e46bSJacob Faibussowitsch   MatDenseCUDAReplaceArray - Allows one to replace the GPU array in a `MATDENSECUDA` matrix
1324742e46bSJacob Faibussowitsch   with an array provided by the user. This is useful to avoid copying an array into a matrix.
1334742e46bSJacob Faibussowitsch 
1344742e46bSJacob Faibussowitsch   Not Collective
1354742e46bSJacob Faibussowitsch 
1364742e46bSJacob Faibussowitsch   Input Parameters:
1374742e46bSJacob Faibussowitsch + mat   - the matrix
1384742e46bSJacob Faibussowitsch - array - the array in column major order
1394742e46bSJacob Faibussowitsch 
1404742e46bSJacob Faibussowitsch   Level: developer
1414742e46bSJacob Faibussowitsch 
1424742e46bSJacob Faibussowitsch   Note:
143*4d5500e8SJunchao Zhang   Adding `const` to `array` was an oversight, see notes in `VecPlaceArray()`.
144*4d5500e8SJunchao Zhang 
1454742e46bSJacob Faibussowitsch   This permanently replaces the GPU array and frees the memory associated with the old GPU
1464742e46bSJacob Faibussowitsch   array. The memory passed in CANNOT be freed by the user. It will be freed when the matrix is
1474742e46bSJacob Faibussowitsch   destroyed. The array should respect the matrix leading dimension.
1484742e46bSJacob Faibussowitsch 
1494742e46bSJacob Faibussowitsch .seealso: `MatDenseCUDAGetArray()`, `MatDenseCUDAPlaceArray()`, `MatDenseCUDAResetArray()`
1504742e46bSJacob Faibussowitsch @*/
MatDenseCUDAReplaceArray(Mat mat,const PetscScalar * array)1514742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDAReplaceArray(Mat mat, const PetscScalar *array)
1524742e46bSJacob Faibussowitsch {
1534742e46bSJacob Faibussowitsch   PetscFunctionBegin;
1544742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMReplaceArray<DeviceType::CUDA>(mat, array));
1554742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1564742e46bSJacob Faibussowitsch }
1574742e46bSJacob Faibussowitsch 
1584742e46bSJacob Faibussowitsch /*@C
1594742e46bSJacob Faibussowitsch   MatDenseCUDAGetArrayWrite - Provides write access to the CUDA buffer inside a `MATDENSECUDA`
1604742e46bSJacob Faibussowitsch   matrix.
1614742e46bSJacob Faibussowitsch 
1624742e46bSJacob Faibussowitsch   Not Collective
1634742e46bSJacob Faibussowitsch 
1642fe279fdSBarry Smith   Input Parameter:
1654742e46bSJacob Faibussowitsch . A - the matrix
1664742e46bSJacob Faibussowitsch 
1672fe279fdSBarry Smith   Output Parameter:
1682fe279fdSBarry Smith . a - the GPU array in column major order
1694742e46bSJacob Faibussowitsch 
1704742e46bSJacob Faibussowitsch   Level: developer
1714742e46bSJacob Faibussowitsch 
1724742e46bSJacob Faibussowitsch   Notes:
1734742e46bSJacob Faibussowitsch   The data on the GPU may not be updated due to operations done on the CPU. If you need updated
1744742e46bSJacob Faibussowitsch   data, use `MatDenseCUDAGetArray()`.
1754742e46bSJacob Faibussowitsch 
1764742e46bSJacob Faibussowitsch   The array must be restored with `MatDenseCUDARestoreArrayWrite()` when no longer needed.
1774742e46bSJacob Faibussowitsch 
1784742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDARestoreArray()`,
1794742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayWrite()`, `MatDenseCUDAGetArrayRead()`,
1804742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayRead()`
1814742e46bSJacob Faibussowitsch @*/
MatDenseCUDAGetArrayWrite(Mat A,PetscScalar ** a)1824742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDAGetArrayWrite(Mat A, PetscScalar **a)
1834742e46bSJacob Faibussowitsch {
1844742e46bSJacob Faibussowitsch   PetscFunctionBegin;
1854742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMGetArrayWrite<DeviceType::CUDA>(A, a));
1864742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1874742e46bSJacob Faibussowitsch }
1884742e46bSJacob Faibussowitsch 
1894742e46bSJacob Faibussowitsch /*@C
1904742e46bSJacob Faibussowitsch   MatDenseCUDARestoreArrayWrite - Restore write access to the CUDA buffer inside a
1914742e46bSJacob Faibussowitsch   `MATDENSECUDA` matrix previously obtained with `MatDenseCUDAGetArrayWrite()`.
1924742e46bSJacob Faibussowitsch 
1934742e46bSJacob Faibussowitsch   Not Collective
1944742e46bSJacob Faibussowitsch 
1954742e46bSJacob Faibussowitsch   Input Parameters:
1964742e46bSJacob Faibussowitsch + A - the matrix
1972fe279fdSBarry Smith - a - the GPU array in column major order
1984742e46bSJacob Faibussowitsch 
1994742e46bSJacob Faibussowitsch   Level: developer
2004742e46bSJacob Faibussowitsch 
2014742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDARestoreArray()`,
2024742e46bSJacob Faibussowitsch `MatDenseCUDAGetArrayWrite()`, `MatDenseCUDARestoreArrayRead()`, `MatDenseCUDAGetArrayRead()`
2034742e46bSJacob Faibussowitsch @*/
MatDenseCUDARestoreArrayWrite(Mat A,PetscScalar ** a)2044742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDARestoreArrayWrite(Mat A, PetscScalar **a)
2054742e46bSJacob Faibussowitsch {
2064742e46bSJacob Faibussowitsch   PetscFunctionBegin;
2074742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMRestoreArrayWrite<DeviceType::CUDA>(A, a));
2084742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2094742e46bSJacob Faibussowitsch }
2104742e46bSJacob Faibussowitsch 
2114742e46bSJacob Faibussowitsch /*@C
2124742e46bSJacob Faibussowitsch   MatDenseCUDAGetArrayRead - Provides read-only access to the CUDA buffer inside a
2134742e46bSJacob Faibussowitsch   `MATDENSECUDA` matrix. The array must be restored with `MatDenseCUDARestoreArrayRead()` when
2144742e46bSJacob Faibussowitsch   no longer needed.
2154742e46bSJacob Faibussowitsch 
2164742e46bSJacob Faibussowitsch   Not Collective
2174742e46bSJacob Faibussowitsch 
2182fe279fdSBarry Smith   Input Parameter:
2194742e46bSJacob Faibussowitsch . A - the matrix
2204742e46bSJacob Faibussowitsch 
2212fe279fdSBarry Smith   Output Parameter:
2222fe279fdSBarry Smith . a - the GPU array in column major order
2234742e46bSJacob Faibussowitsch 
2244742e46bSJacob Faibussowitsch   Level: developer
2254742e46bSJacob Faibussowitsch 
2264742e46bSJacob Faibussowitsch   Note:
2274742e46bSJacob Faibussowitsch   Data may be copied to the GPU due to operations done on the CPU. If you need write only
2284742e46bSJacob Faibussowitsch   access, use `MatDenseCUDAGetArrayWrite()`.
2294742e46bSJacob Faibussowitsch 
2304742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDARestoreArray()`,
2314742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayWrite()`, `MatDenseCUDAGetArrayWrite()`,
2324742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayRead()`
2334742e46bSJacob Faibussowitsch @*/
MatDenseCUDAGetArrayRead(Mat A,const PetscScalar ** a)2344742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDAGetArrayRead(Mat A, const PetscScalar **a)
2354742e46bSJacob Faibussowitsch {
2364742e46bSJacob Faibussowitsch   PetscFunctionBegin;
2374742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMGetArrayRead<DeviceType::CUDA>(A, a));
2384742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2394742e46bSJacob Faibussowitsch }
2404742e46bSJacob Faibussowitsch 
2414742e46bSJacob Faibussowitsch /*@C
2424742e46bSJacob Faibussowitsch   MatDenseCUDARestoreArrayRead - Restore read-only access to the CUDA buffer inside a
2434742e46bSJacob Faibussowitsch   `MATDENSECUDA` matrix previously obtained with a call to `MatDenseCUDAGetArrayRead()`.
2444742e46bSJacob Faibussowitsch 
2454742e46bSJacob Faibussowitsch   Not Collective
2464742e46bSJacob Faibussowitsch 
2474742e46bSJacob Faibussowitsch   Input Parameters:
2484742e46bSJacob Faibussowitsch + A - the matrix
2492fe279fdSBarry Smith - a - the GPU array in column major order
2504742e46bSJacob Faibussowitsch 
2514742e46bSJacob Faibussowitsch   Level: developer
2524742e46bSJacob Faibussowitsch 
2534742e46bSJacob Faibussowitsch   Note:
2544742e46bSJacob Faibussowitsch   Data can be copied to the GPU due to operations done on the CPU. If you need write only
2554742e46bSJacob Faibussowitsch   access, use `MatDenseCUDAGetArrayWrite()`.
2564742e46bSJacob Faibussowitsch 
2574742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDARestoreArray()`,
2584742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayWrite()`, `MatDenseCUDAGetArrayWrite()`, `MatDenseCUDAGetArrayRead()`
2594742e46bSJacob Faibussowitsch @*/
MatDenseCUDARestoreArrayRead(Mat A,const PetscScalar ** a)2604742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDARestoreArrayRead(Mat A, const PetscScalar **a)
2614742e46bSJacob Faibussowitsch {
2624742e46bSJacob Faibussowitsch   PetscFunctionBegin;
2634742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMRestoreArrayRead<DeviceType::CUDA>(A, a));
2644742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2654742e46bSJacob Faibussowitsch }
2664742e46bSJacob Faibussowitsch 
2674742e46bSJacob Faibussowitsch /*@C
2684742e46bSJacob Faibussowitsch   MatDenseCUDAGetArray - Provides access to the CUDA buffer inside a `MATDENSECUDA` matrix. The
2694742e46bSJacob Faibussowitsch   array must be restored with `MatDenseCUDARestoreArray()` when no longer needed.
2704742e46bSJacob Faibussowitsch 
2714742e46bSJacob Faibussowitsch   Not Collective
2724742e46bSJacob Faibussowitsch 
2732fe279fdSBarry Smith   Input Parameter:
2744742e46bSJacob Faibussowitsch . A - the matrix
2754742e46bSJacob Faibussowitsch 
2762fe279fdSBarry Smith   Output Parameter:
2772fe279fdSBarry Smith . a - the GPU array in column major order
2784742e46bSJacob Faibussowitsch 
2794742e46bSJacob Faibussowitsch   Level: developer
2804742e46bSJacob Faibussowitsch 
2814742e46bSJacob Faibussowitsch   Note:
2824742e46bSJacob Faibussowitsch   Data can be copied to the GPU due to operations done on the CPU. If you need write only
2834742e46bSJacob Faibussowitsch   access, use `MatDenseCUDAGetArrayWrite()`. For read-only access, use
2844742e46bSJacob Faibussowitsch   `MatDenseCUDAGetArrayRead()`.
2854742e46bSJacob Faibussowitsch 
2864742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArrayRead()`, `MatDenseCUDARestoreArray()`,
2874742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayWrite()`, `MatDenseCUDAGetArrayWrite()`,
2884742e46bSJacob Faibussowitsch           `MatDenseCUDARestoreArrayRead()`
2894742e46bSJacob Faibussowitsch @*/
MatDenseCUDAGetArray(Mat A,PetscScalar ** a)2904742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDAGetArray(Mat A, PetscScalar **a)
2914742e46bSJacob Faibussowitsch {
2924742e46bSJacob Faibussowitsch   PetscFunctionBegin;
2934742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMGetArray<DeviceType::CUDA>(A, a));
2944742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2954742e46bSJacob Faibussowitsch }
2964742e46bSJacob Faibussowitsch 
2974742e46bSJacob Faibussowitsch /*@C
2984742e46bSJacob Faibussowitsch   MatDenseCUDARestoreArray - Restore access to the CUDA buffer inside a `MATDENSECUDA` matrix
2994742e46bSJacob Faibussowitsch   previously obtained with `MatDenseCUDAGetArray()`.
3004742e46bSJacob Faibussowitsch 
3014742e46bSJacob Faibussowitsch   Not Collective
3024742e46bSJacob Faibussowitsch 
3034742e46bSJacob Faibussowitsch   Level: developer
3044742e46bSJacob Faibussowitsch 
3054742e46bSJacob Faibussowitsch   Input Parameters:
3064742e46bSJacob Faibussowitsch + A - the matrix
3072fe279fdSBarry Smith - a - the GPU array in column major order
3084742e46bSJacob Faibussowitsch 
3094742e46bSJacob Faibussowitsch .seealso: `MATDENSECUDA`, `MatDenseCUDAGetArray()`, `MatDenseCUDARestoreArrayWrite()`,
3104742e46bSJacob Faibussowitsch           `MatDenseCUDAGetArrayWrite()`, `MatDenseCUDARestoreArrayRead()`, `MatDenseCUDAGetArrayRead()`
3114742e46bSJacob Faibussowitsch @*/
MatDenseCUDARestoreArray(Mat A,PetscScalar ** a)3124742e46bSJacob Faibussowitsch PetscErrorCode MatDenseCUDARestoreArray(Mat A, PetscScalar **a)
3134742e46bSJacob Faibussowitsch {
3144742e46bSJacob Faibussowitsch   PetscFunctionBegin;
3154742e46bSJacob Faibussowitsch   PetscCall(MatDenseCUPMRestoreArray<DeviceType::CUDA>(A, a));
3164742e46bSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3174742e46bSJacob Faibussowitsch }
3183d9668e3SJacob Faibussowitsch 
3193d9668e3SJacob Faibussowitsch /*@C
3203d9668e3SJacob Faibussowitsch   MatDenseCUDASetPreallocation - Set the device array used for storing the matrix elements of a
3213d9668e3SJacob Faibussowitsch   `MATDENSECUDA` matrix
3223d9668e3SJacob Faibussowitsch 
3233d9668e3SJacob Faibussowitsch   Collective
3243d9668e3SJacob Faibussowitsch 
3253d9668e3SJacob Faibussowitsch   Input Parameters:
3263d9668e3SJacob Faibussowitsch + A            - the matrix
3273d9668e3SJacob Faibussowitsch - device_array - the array (or `NULL`)
3283d9668e3SJacob Faibussowitsch 
3293d9668e3SJacob Faibussowitsch   Level: intermediate
3303d9668e3SJacob Faibussowitsch 
331be50c303SSatish Balay .seealso: [](ch_matrices), `Mat`, `MATDENSECUDA`, `MatCreate()`, `MatCreateDenseCUDA()`,
3323d9668e3SJacob Faibussowitsch `MatSetValues()`, `MatDenseSetLDA()`
3333d9668e3SJacob Faibussowitsch @*/
MatDenseCUDASetPreallocation(Mat A,PetscScalar * device_array)3343d9668e3SJacob Faibussowitsch PetscErrorCode MatDenseCUDASetPreallocation(Mat A, PetscScalar *device_array)
3353d9668e3SJacob Faibussowitsch {
3363d9668e3SJacob Faibussowitsch   PetscFunctionBegin;
3373d9668e3SJacob Faibussowitsch   PetscCall(MatDenseCUPMSetPreallocation<DeviceType::CUDA>(A, device_array));
3383d9668e3SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3393d9668e3SJacob Faibussowitsch }
340