1*4742e46bSJacob Faibussowitsch #include "../matseqdensecupm.hpp" 2*4742e46bSJacob Faibussowitsch 3*4742e46bSJacob Faibussowitsch using namespace Petsc::mat::cupm; 4*4742e46bSJacob Faibussowitsch using Petsc::device::cupm::DeviceType; 5*4742e46bSJacob Faibussowitsch 6*4742e46bSJacob Faibussowitsch static constexpr impl::MatDense_Seq_CUPM<DeviceType::CUDA> cupm_mat{}; 7*4742e46bSJacob Faibussowitsch 8*4742e46bSJacob Faibussowitsch /*MC 9*4742e46bSJacob Faibussowitsch MATSEQDENSECUDA - "seqdensecuda" - A matrix type to be used for sequential dense matrices on 10*4742e46bSJacob Faibussowitsch GPUs. 11*4742e46bSJacob Faibussowitsch 12*4742e46bSJacob Faibussowitsch Options Database Keys: 13*4742e46bSJacob Faibussowitsch . -mat_type seqdensecuda - sets the matrix type to `MATSEQDENSECUDA` during a call to 14*4742e46bSJacob Faibussowitsch `MatSetFromOptions()` 15*4742e46bSJacob Faibussowitsch 16*4742e46bSJacob Faibussowitsch Level: beginner 17*4742e46bSJacob Faibussowitsch 18*4742e46bSJacob Faibussowitsch .seealso: `MATSEQDENSE` 19*4742e46bSJacob Faibussowitsch M*/ 20*4742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatCreate_SeqDenseCUDA(Mat A) 21*4742e46bSJacob Faibussowitsch { 22*4742e46bSJacob Faibussowitsch PetscFunctionBegin; 23*4742e46bSJacob Faibussowitsch PetscCall(cupm_mat.Create(A)); 24*4742e46bSJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 25*4742e46bSJacob Faibussowitsch } 26*4742e46bSJacob Faibussowitsch 27*4742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSECUDA(void) 28*4742e46bSJacob Faibussowitsch { 29*4742e46bSJacob Faibussowitsch PetscFunctionBegin; 30*4742e46bSJacob Faibussowitsch PetscCall(impl::MatSolverTypeRegister_DENSECUPM<DeviceType::CUDA>()); 31*4742e46bSJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 32*4742e46bSJacob Faibussowitsch } 33*4742e46bSJacob Faibussowitsch 34*4742e46bSJacob Faibussowitsch PetscErrorCode MatConvert_SeqDense_SeqDenseCUDA(Mat A, MatType newtype, MatReuse reuse, Mat *newmat) 35*4742e46bSJacob Faibussowitsch { 36*4742e46bSJacob Faibussowitsch PetscFunctionBegin; 37*4742e46bSJacob Faibussowitsch PetscCall(cupm_mat.Convert_SeqDense_SeqDenseCUPM(A, newtype, reuse, newmat)); 38*4742e46bSJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 39*4742e46bSJacob Faibussowitsch } 40*4742e46bSJacob Faibussowitsch 41*4742e46bSJacob Faibussowitsch PetscErrorCode MatMatMultNumeric_SeqDenseCUDA_SeqDenseCUDA_Internal(Mat A, Mat B, Mat C, PetscBool TA, PetscBool TB) 42*4742e46bSJacob Faibussowitsch { 43*4742e46bSJacob Faibussowitsch PetscFunctionBegin; 44*4742e46bSJacob Faibussowitsch PetscCall(impl::MatMatMultNumeric_SeqDenseCUPM_SeqDenseCUPM<DeviceType::CUDA>(A, B, C, TA, TB)); 45*4742e46bSJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 46*4742e46bSJacob Faibussowitsch } 47*4742e46bSJacob Faibussowitsch 48*4742e46bSJacob Faibussowitsch PetscErrorCode MatSeqDenseCUDAInvertFactors_Internal(Mat A) 49*4742e46bSJacob Faibussowitsch { 50*4742e46bSJacob Faibussowitsch PetscFunctionBegin; 51*4742e46bSJacob Faibussowitsch PetscCall(cupm_mat.InvertFactors(A)); 52*4742e46bSJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 53*4742e46bSJacob Faibussowitsch } 54*4742e46bSJacob Faibussowitsch 55*4742e46bSJacob Faibussowitsch /*@C 56*4742e46bSJacob Faibussowitsch MatCreateSeqDenseCUDA - Creates a sequential matrix in dense format using CUDA. 57*4742e46bSJacob Faibussowitsch 58*4742e46bSJacob Faibussowitsch Collective 59*4742e46bSJacob Faibussowitsch 60*4742e46bSJacob Faibussowitsch Input Parameters: 61*4742e46bSJacob Faibussowitsch + comm - MPI communicator 62*4742e46bSJacob Faibussowitsch . m - number of rows 63*4742e46bSJacob Faibussowitsch . n - number of columns 64*4742e46bSJacob Faibussowitsch - data - optional location of GPU matrix data. Pass `NULL` to let PETSc to control matrix 65*4742e46bSJacob Faibussowitsch memory allocation 66*4742e46bSJacob Faibussowitsch 67*4742e46bSJacob Faibussowitsch Output Parameter: 68*4742e46bSJacob Faibussowitsch . A - the matrix 69*4742e46bSJacob Faibussowitsch 70*4742e46bSJacob Faibussowitsch Level: intermediate 71*4742e46bSJacob Faibussowitsch 72*4742e46bSJacob Faibussowitsch .seealso: `MATSEQDENSE`, `MatCreate()`, `MatCreateSeqDense()` 73*4742e46bSJacob Faibussowitsch @*/ 74*4742e46bSJacob Faibussowitsch PetscErrorCode MatCreateSeqDenseCUDA(MPI_Comm comm, PetscInt m, PetscInt n, PetscScalar *data, Mat *A) 75*4742e46bSJacob Faibussowitsch { 76*4742e46bSJacob Faibussowitsch PetscFunctionBegin; 77*4742e46bSJacob Faibussowitsch PetscCall(MatCreateSeqDenseCUPM<DeviceType::CUDA>(comm, m, n, data, A)); 78*4742e46bSJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 79*4742e46bSJacob Faibussowitsch } 80