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