1aaa7dc30SBarry Smith #include <petscconf.h> 28f86e40fSKarl Rupp #include <../src/mat/impls/aij/mpi/mpiaij.h> /*I "petscmat.h" I*/ 365e3cb35SKarl Rupp #include <../src/mat/impls/aij/seq/seqviennacl/viennaclmatimpl.h> 48f86e40fSKarl Rupp 58f86e40fSKarl Rupp PetscErrorCode MatMPIAIJSetPreallocation_MPIAIJViennaCL(Mat B,PetscInt d_nz,const PetscInt d_nnz[],PetscInt o_nz,const PetscInt o_nnz[]) 68f86e40fSKarl Rupp { 78f86e40fSKarl Rupp Mat_MPIAIJ *b = (Mat_MPIAIJ*)B->data; 88f86e40fSKarl Rupp PetscErrorCode ierr; 98f86e40fSKarl Rupp 108f86e40fSKarl Rupp PetscFunctionBegin; 118f86e40fSKarl Rupp ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 128f86e40fSKarl Rupp ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 138f86e40fSKarl Rupp if (!B->preallocated) { 148f86e40fSKarl Rupp /* Explicitly create the two MATSEQAIJVIENNACL matrices. */ 158f86e40fSKarl Rupp ierr = MatCreate(PETSC_COMM_SELF,&b->A);CHKERRQ(ierr); 168f86e40fSKarl Rupp ierr = MatSetSizes(b->A,B->rmap->n,B->cmap->n,B->rmap->n,B->cmap->n);CHKERRQ(ierr); 178f86e40fSKarl Rupp ierr = MatSetType(b->A,MATSEQAIJVIENNACL);CHKERRQ(ierr); 18f7daeb2aSKarl Rupp ierr = PetscLogObjectParent((PetscObject)B,(PetscObject)b->A);CHKERRQ(ierr); 198f86e40fSKarl Rupp ierr = MatCreate(PETSC_COMM_SELF,&b->B);CHKERRQ(ierr); 208f86e40fSKarl Rupp ierr = MatSetSizes(b->B,B->rmap->n,B->cmap->N,B->rmap->n,B->cmap->N);CHKERRQ(ierr); 218f86e40fSKarl Rupp ierr = MatSetType(b->B,MATSEQAIJVIENNACL);CHKERRQ(ierr); 22f7daeb2aSKarl Rupp ierr = PetscLogObjectParent((PetscObject)B,(PetscObject)b->B);CHKERRQ(ierr); 238f86e40fSKarl Rupp } 248f86e40fSKarl Rupp ierr = MatSeqAIJSetPreallocation(b->A,d_nz,d_nnz);CHKERRQ(ierr); 258f86e40fSKarl Rupp ierr = MatSeqAIJSetPreallocation(b->B,o_nz,o_nnz);CHKERRQ(ierr); 268f86e40fSKarl Rupp B->preallocated = PETSC_TRUE; 278f86e40fSKarl Rupp PetscFunctionReturn(0); 288f86e40fSKarl Rupp } 298f86e40fSKarl Rupp 302a7a6963SBarry Smith PetscErrorCode MatCreateVecs_MPIAIJViennaCL(Mat mat,Vec *right,Vec *left) 318f86e40fSKarl Rupp { 328f86e40fSKarl Rupp PetscErrorCode ierr; 3333d57670SJed Brown PetscInt rbs,cbs; 348f86e40fSKarl Rupp 358f86e40fSKarl Rupp PetscFunctionBegin; 3633d57670SJed Brown ierr = MatGetBlockSizes(mat,&rbs,&cbs);CHKERRQ(ierr); 378f86e40fSKarl Rupp if (right) { 388f86e40fSKarl Rupp ierr = VecCreate(PetscObjectComm((PetscObject)mat),right);CHKERRQ(ierr); 398f86e40fSKarl Rupp ierr = VecSetSizes(*right,mat->cmap->n,PETSC_DETERMINE);CHKERRQ(ierr); 4033d57670SJed Brown ierr = VecSetBlockSize(*right,cbs);CHKERRQ(ierr); 418f86e40fSKarl Rupp ierr = VecSetType(*right,VECVIENNACL);CHKERRQ(ierr); 428f86e40fSKarl Rupp ierr = VecSetLayout(*right,mat->cmap);CHKERRQ(ierr); 438f86e40fSKarl Rupp } 448f86e40fSKarl Rupp if (left) { 458f86e40fSKarl Rupp ierr = VecCreate(PetscObjectComm((PetscObject)mat),left);CHKERRQ(ierr); 468f86e40fSKarl Rupp ierr = VecSetSizes(*left,mat->rmap->n,PETSC_DETERMINE);CHKERRQ(ierr); 4733d57670SJed Brown ierr = VecSetBlockSize(*left,rbs);CHKERRQ(ierr); 488f86e40fSKarl Rupp ierr = VecSetType(*left,VECVIENNACL);CHKERRQ(ierr); 498f86e40fSKarl Rupp ierr = VecSetLayout(*left,mat->rmap);CHKERRQ(ierr); 508f86e40fSKarl Rupp } 518f86e40fSKarl Rupp PetscFunctionReturn(0); 528f86e40fSKarl Rupp } 538f86e40fSKarl Rupp 5474fd8ad3SBarry Smith PetscErrorCode MatAssemblyEnd_MPIAIJViennaCL(Mat A,MatAssemblyType mode) 5574fd8ad3SBarry Smith { 5674fd8ad3SBarry Smith Mat_MPIAIJ *b = (Mat_MPIAIJ*)A->data; 5774fd8ad3SBarry Smith PetscErrorCode ierr; 5874fd8ad3SBarry Smith PetscBool v; 5974fd8ad3SBarry Smith 6074fd8ad3SBarry Smith PetscFunctionBegin; 6174fd8ad3SBarry Smith ierr = MatAssemblyEnd_MPIAIJ(A,mode);CHKERRQ(ierr); 6274fd8ad3SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)b->lvec,VECSEQVIENNACL,&v);CHKERRQ(ierr); 6374fd8ad3SBarry Smith if (!v) { 6474fd8ad3SBarry Smith PetscInt m; 6574fd8ad3SBarry Smith ierr = VecGetSize(b->lvec,&m);CHKERRQ(ierr); 6674fd8ad3SBarry Smith ierr = VecDestroy(&b->lvec);CHKERRQ(ierr); 6774fd8ad3SBarry Smith ierr = VecCreateSeqViennaCL(PETSC_COMM_SELF,m,&b->lvec);CHKERRQ(ierr); 6874fd8ad3SBarry Smith } 6974fd8ad3SBarry Smith PetscFunctionReturn(0); 7074fd8ad3SBarry Smith } 718f86e40fSKarl Rupp 728f86e40fSKarl Rupp PetscErrorCode MatDestroy_MPIAIJViennaCL(Mat A) 738f86e40fSKarl Rupp { 748f86e40fSKarl Rupp PetscErrorCode ierr; 758f86e40fSKarl Rupp 768f86e40fSKarl Rupp PetscFunctionBegin; 778f86e40fSKarl Rupp ierr = MatDestroy_MPIAIJ(A);CHKERRQ(ierr); 788f86e40fSKarl Rupp PetscFunctionReturn(0); 798f86e40fSKarl Rupp } 808f86e40fSKarl Rupp 818f86e40fSKarl Rupp PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJViennaCL(Mat A) 828f86e40fSKarl Rupp { 838f86e40fSKarl Rupp PetscErrorCode ierr; 848f86e40fSKarl Rupp 858f86e40fSKarl Rupp PetscFunctionBegin; 868f86e40fSKarl Rupp ierr = MatCreate_MPIAIJ(A);CHKERRQ(ierr); 87ab6435e1SKarl Rupp ierr = PetscObjectComposeFunction((PetscObject)A,"MatMPIAIJSetPreallocation_C",MatMPIAIJSetPreallocation_MPIAIJViennaCL);CHKERRQ(ierr); 882a7a6963SBarry Smith A->ops->getvecs = MatCreateVecs_MPIAIJViennaCL; 8974fd8ad3SBarry Smith A->ops->assemblyend = MatAssemblyEnd_MPIAIJViennaCL; 908f86e40fSKarl Rupp ierr = PetscObjectChangeTypeName((PetscObject)A,MATMPIAIJVIENNACL);CHKERRQ(ierr); 918f86e40fSKarl Rupp PetscFunctionReturn(0); 928f86e40fSKarl Rupp } 938f86e40fSKarl Rupp 948f86e40fSKarl Rupp 958f86e40fSKarl Rupp /*@ 968f86e40fSKarl Rupp MatCreateAIJViennaCL - Creates a sparse matrix in AIJ (compressed row) format 97023073b3SKarl Rupp (the default parallel PETSc format). This matrix will ultimately be pushed down 988f86e40fSKarl Rupp to GPUs and use the ViennaCL library for calculations. For good matrix 998f86e40fSKarl Rupp assembly performance the user should preallocate the matrix storage by setting 1008f86e40fSKarl Rupp the parameter nz (or the array nnz). By setting these parameters accurately, 1018f86e40fSKarl Rupp performance during matrix assembly can be increased substantially. 1028f86e40fSKarl Rupp 1038f86e40fSKarl Rupp 1048f86e40fSKarl Rupp Collective on MPI_Comm 1058f86e40fSKarl Rupp 1068f86e40fSKarl Rupp Input Parameters: 1078f86e40fSKarl Rupp + comm - MPI communicator, set to PETSC_COMM_SELF 1088f86e40fSKarl Rupp . m - number of rows 1098f86e40fSKarl Rupp . n - number of columns 1108f86e40fSKarl Rupp . nz - number of nonzeros per row (same for all rows) 1118f86e40fSKarl Rupp - nnz - array containing the number of nonzeros in the various rows 1128f86e40fSKarl Rupp (possibly different for each row) or NULL 1138f86e40fSKarl Rupp 1148f86e40fSKarl Rupp Output Parameter: 1158f86e40fSKarl Rupp . A - the matrix 1168f86e40fSKarl Rupp 1178f86e40fSKarl Rupp It is recommended that one use the MatCreate(), MatSetType() and/or MatSetFromOptions(), 1188f86e40fSKarl Rupp MatXXXXSetPreallocation() paradigm instead of this routine directly. 1198f86e40fSKarl Rupp [MatXXXXSetPreallocation() is, for example, MatSeqAIJSetPreallocation] 1208f86e40fSKarl Rupp 1218f86e40fSKarl Rupp Notes: 1228f86e40fSKarl Rupp If nnz is given then nz is ignored 1238f86e40fSKarl Rupp 1248f86e40fSKarl Rupp The AIJ format (also called the Yale sparse matrix format or 1258f86e40fSKarl Rupp compressed row storage), is fully compatible with standard Fortran 77 1268f86e40fSKarl Rupp storage. That is, the stored row and column indices can begin at 1278f86e40fSKarl Rupp either one (as in Fortran) or zero. See the users' manual for details. 1288f86e40fSKarl Rupp 1298f86e40fSKarl Rupp Specify the preallocated storage with either nz or nnz (not both). 1308f86e40fSKarl Rupp Set nz=PETSC_DEFAULT and nnz=NULL for PETSc to control dynamic memory 1318f86e40fSKarl Rupp allocation. For large problems you MUST preallocate memory or you 1328f86e40fSKarl Rupp will get TERRIBLE performance, see the users' manual chapter on matrices. 1338f86e40fSKarl Rupp 1348f86e40fSKarl Rupp Level: intermediate 1358f86e40fSKarl Rupp 136*e9e886b6SKarl Rupp .seealso: MatCreate(), MatCreateAIJ(), MatCreateAIJCUSPARSE(), MatSetValues(), MatSeqAIJSetColumnIndices(), MatCreateSeqAIJWithArrays(), MatCreateAIJ(), MATMPIAIJVIENNACL, MATAIJVIENNACL 1378f86e40fSKarl Rupp @*/ 1388f86e40fSKarl Rupp PetscErrorCode MatCreateAIJViennaCL(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt d_nz,const PetscInt d_nnz[],PetscInt o_nz,const PetscInt o_nnz[],Mat *A) 1398f86e40fSKarl Rupp { 1408f86e40fSKarl Rupp PetscErrorCode ierr; 1418f86e40fSKarl Rupp PetscMPIInt size; 1428f86e40fSKarl Rupp 1438f86e40fSKarl Rupp PetscFunctionBegin; 1448f86e40fSKarl Rupp ierr = MatCreate(comm,A);CHKERRQ(ierr); 1458f86e40fSKarl Rupp ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr); 1468f86e40fSKarl Rupp ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 1478f86e40fSKarl Rupp if (size > 1) { 1488f86e40fSKarl Rupp ierr = MatSetType(*A,MATMPIAIJVIENNACL);CHKERRQ(ierr); 1498f86e40fSKarl Rupp ierr = MatMPIAIJSetPreallocation(*A,d_nz,d_nnz,o_nz,o_nnz);CHKERRQ(ierr); 1508f86e40fSKarl Rupp } else { 1518f86e40fSKarl Rupp ierr = MatSetType(*A,MATSEQAIJVIENNACL);CHKERRQ(ierr); 1528f86e40fSKarl Rupp ierr = MatSeqAIJSetPreallocation(*A,d_nz,d_nnz);CHKERRQ(ierr); 1538f86e40fSKarl Rupp } 1548f86e40fSKarl Rupp PetscFunctionReturn(0); 1558f86e40fSKarl Rupp } 1568f86e40fSKarl Rupp 1573ca39a21SBarry Smith /*MC 1588f86e40fSKarl Rupp MATAIJVIENNACL - MATMPIAIJVIENNACL= "aijviennacl" = "mpiaijviennacl" - A matrix type to be used for sparse matrices. 1598f86e40fSKarl Rupp 1608f86e40fSKarl Rupp A matrix type (CSR format) whose data resides on GPUs. 1618f86e40fSKarl Rupp All matrix calculations are performed using the ViennaCL library. 1628f86e40fSKarl Rupp 1638f86e40fSKarl Rupp This matrix type is identical to MATSEQAIJVIENNACL when constructed with a single process communicator, 1648f86e40fSKarl Rupp and MATMPIAIJVIENNACL otherwise. As a result, for single process communicators, 1658f86e40fSKarl Rupp MatSeqAIJSetPreallocation is supported, and similarly MatMPIAIJSetPreallocation is supported 1668f86e40fSKarl Rupp for communicators controlling multiple processes. It is recommended that you call both of 1678f86e40fSKarl Rupp the above preallocation routines for simplicity. 1688f86e40fSKarl Rupp 1698f86e40fSKarl Rupp Options Database Keys: 1708f86e40fSKarl Rupp + -mat_type mpiaijviennacl - sets the matrix type to "mpiaijviennacl" during a call to MatSetFromOptions() 1718f86e40fSKarl Rupp 1728f86e40fSKarl Rupp Level: beginner 1738f86e40fSKarl Rupp 1748f86e40fSKarl Rupp .seealso: MatCreateAIJViennaCL(), MATSEQAIJVIENNACL, MatCreateSeqAIJVIENNACL() 1758f86e40fSKarl Rupp M*/ 176