xref: /petsc/src/mat/impls/aij/mpi/mpiviennacl/mpiaijviennacl.cxx (revision 6f3d89d0b697a3d79aa40878724d2c791c95edac)
199acd6aaSStefano Zampini #define PETSC_SKIP_IMMINTRIN_H_CUDAWORKAROUND 1
299acd6aaSStefano Zampini 
3aaa7dc30SBarry Smith #include <petscconf.h>
48f86e40fSKarl Rupp #include <../src/mat/impls/aij/mpi/mpiaij.h>   /*I "petscmat.h" I*/
565e3cb35SKarl Rupp #include <../src/mat/impls/aij/seq/seqviennacl/viennaclmatimpl.h>
68f86e40fSKarl Rupp 
78f86e40fSKarl Rupp PetscErrorCode  MatMPIAIJSetPreallocation_MPIAIJViennaCL(Mat B,PetscInt d_nz,const PetscInt d_nnz[],PetscInt o_nz,const PetscInt o_nnz[])
88f86e40fSKarl Rupp {
98f86e40fSKarl Rupp   Mat_MPIAIJ     *b = (Mat_MPIAIJ*)B->data;
108f86e40fSKarl Rupp   PetscErrorCode ierr;
118f86e40fSKarl Rupp 
128f86e40fSKarl Rupp   PetscFunctionBegin;
138f86e40fSKarl Rupp   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
148f86e40fSKarl Rupp   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
158f86e40fSKarl Rupp   if (!B->preallocated) {
168f86e40fSKarl Rupp     /* Explicitly create the two MATSEQAIJVIENNACL matrices. */
178f86e40fSKarl Rupp     ierr = MatCreate(PETSC_COMM_SELF,&b->A);CHKERRQ(ierr);
188f86e40fSKarl Rupp     ierr = MatSetSizes(b->A,B->rmap->n,B->cmap->n,B->rmap->n,B->cmap->n);CHKERRQ(ierr);
198f86e40fSKarl Rupp     ierr = MatSetType(b->A,MATSEQAIJVIENNACL);CHKERRQ(ierr);
20f7daeb2aSKarl Rupp     ierr = PetscLogObjectParent((PetscObject)B,(PetscObject)b->A);CHKERRQ(ierr);
218f86e40fSKarl Rupp     ierr = MatCreate(PETSC_COMM_SELF,&b->B);CHKERRQ(ierr);
228f86e40fSKarl Rupp     ierr = MatSetSizes(b->B,B->rmap->n,B->cmap->N,B->rmap->n,B->cmap->N);CHKERRQ(ierr);
238f86e40fSKarl Rupp     ierr = MatSetType(b->B,MATSEQAIJVIENNACL);CHKERRQ(ierr);
24f7daeb2aSKarl Rupp     ierr = PetscLogObjectParent((PetscObject)B,(PetscObject)b->B);CHKERRQ(ierr);
258f86e40fSKarl Rupp   }
268f86e40fSKarl Rupp   ierr = MatSeqAIJSetPreallocation(b->A,d_nz,d_nnz);CHKERRQ(ierr);
278f86e40fSKarl Rupp   ierr = MatSeqAIJSetPreallocation(b->B,o_nz,o_nnz);CHKERRQ(ierr);
288f86e40fSKarl Rupp   B->preallocated = PETSC_TRUE;
298f86e40fSKarl Rupp   PetscFunctionReturn(0);
308f86e40fSKarl Rupp }
318f86e40fSKarl Rupp 
3274fd8ad3SBarry Smith PetscErrorCode MatAssemblyEnd_MPIAIJViennaCL(Mat A,MatAssemblyType mode)
3374fd8ad3SBarry Smith {
3474fd8ad3SBarry Smith   Mat_MPIAIJ     *b = (Mat_MPIAIJ*)A->data;
3574fd8ad3SBarry Smith   PetscErrorCode ierr;
3674fd8ad3SBarry Smith   PetscBool      v;
3774fd8ad3SBarry Smith 
3874fd8ad3SBarry Smith   PetscFunctionBegin;
3974fd8ad3SBarry Smith   ierr = MatAssemblyEnd_MPIAIJ(A,mode);CHKERRQ(ierr);
4074fd8ad3SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)b->lvec,VECSEQVIENNACL,&v);CHKERRQ(ierr);
4174fd8ad3SBarry Smith   if (!v) {
4274fd8ad3SBarry Smith     PetscInt m;
4374fd8ad3SBarry Smith     ierr = VecGetSize(b->lvec,&m);CHKERRQ(ierr);
4474fd8ad3SBarry Smith     ierr = VecDestroy(&b->lvec);CHKERRQ(ierr);
4574fd8ad3SBarry Smith     ierr = VecCreateSeqViennaCL(PETSC_COMM_SELF,m,&b->lvec);CHKERRQ(ierr);
4674fd8ad3SBarry Smith   }
4774fd8ad3SBarry Smith   PetscFunctionReturn(0);
4874fd8ad3SBarry Smith }
498f86e40fSKarl Rupp 
508f86e40fSKarl Rupp PetscErrorCode MatDestroy_MPIAIJViennaCL(Mat A)
518f86e40fSKarl Rupp {
528f86e40fSKarl Rupp   PetscErrorCode ierr;
538f86e40fSKarl Rupp 
548f86e40fSKarl Rupp   PetscFunctionBegin;
558f86e40fSKarl Rupp   ierr = MatDestroy_MPIAIJ(A);CHKERRQ(ierr);
568f86e40fSKarl Rupp   PetscFunctionReturn(0);
578f86e40fSKarl Rupp }
588f86e40fSKarl Rupp 
598f86e40fSKarl Rupp PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJViennaCL(Mat A)
608f86e40fSKarl Rupp {
618f86e40fSKarl Rupp   PetscErrorCode ierr;
628f86e40fSKarl Rupp 
638f86e40fSKarl Rupp   PetscFunctionBegin;
648f86e40fSKarl Rupp   ierr = MatCreate_MPIAIJ(A);CHKERRQ(ierr);
65*6f3d89d0SStefano Zampini   A->boundtocpu = PETSC_FALSE;
6634136279SStefano Zampini   ierr = PetscFree(A->defaultvectype);CHKERRQ(ierr);
6734136279SStefano Zampini   ierr = PetscStrallocpy(VECVIENNACL,&A->defaultvectype);CHKERRQ(ierr);
68ab6435e1SKarl Rupp   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMPIAIJSetPreallocation_C",MatMPIAIJSetPreallocation_MPIAIJViennaCL);CHKERRQ(ierr);
6974fd8ad3SBarry Smith   A->ops->assemblyend = MatAssemblyEnd_MPIAIJViennaCL;
708f86e40fSKarl Rupp   ierr = PetscObjectChangeTypeName((PetscObject)A,MATMPIAIJVIENNACL);CHKERRQ(ierr);
718f86e40fSKarl Rupp   PetscFunctionReturn(0);
728f86e40fSKarl Rupp }
738f86e40fSKarl Rupp 
748f86e40fSKarl Rupp 
75cab5ea25SPierre Jolivet /*@C
768f86e40fSKarl Rupp    MatCreateAIJViennaCL - Creates a sparse matrix in AIJ (compressed row) format
77023073b3SKarl Rupp    (the default parallel PETSc format).  This matrix will ultimately be pushed down
788f86e40fSKarl Rupp    to GPUs and use the ViennaCL library for calculations. For good matrix
798f86e40fSKarl Rupp    assembly performance the user should preallocate the matrix storage by setting
808f86e40fSKarl Rupp    the parameter nz (or the array nnz).  By setting these parameters accurately,
818f86e40fSKarl Rupp    performance during matrix assembly can be increased substantially.
828f86e40fSKarl Rupp 
838f86e40fSKarl Rupp 
84d083f849SBarry Smith    Collective
858f86e40fSKarl Rupp 
868f86e40fSKarl Rupp    Input Parameters:
878f86e40fSKarl Rupp +  comm - MPI communicator, set to PETSC_COMM_SELF
888f86e40fSKarl Rupp .  m - number of rows
898f86e40fSKarl Rupp .  n - number of columns
908f86e40fSKarl Rupp .  nz - number of nonzeros per row (same for all rows)
918f86e40fSKarl Rupp -  nnz - array containing the number of nonzeros in the various rows
928f86e40fSKarl Rupp          (possibly different for each row) or NULL
938f86e40fSKarl Rupp 
948f86e40fSKarl Rupp    Output Parameter:
958f86e40fSKarl Rupp .  A - the matrix
968f86e40fSKarl Rupp 
978f86e40fSKarl Rupp    It is recommended that one use the MatCreate(), MatSetType() and/or MatSetFromOptions(),
988f86e40fSKarl Rupp    MatXXXXSetPreallocation() paradigm instead of this routine directly.
998f86e40fSKarl Rupp    [MatXXXXSetPreallocation() is, for example, MatSeqAIJSetPreallocation]
1008f86e40fSKarl Rupp 
1018f86e40fSKarl Rupp    Notes:
1028f86e40fSKarl Rupp    If nnz is given then nz is ignored
1038f86e40fSKarl Rupp 
1048f86e40fSKarl Rupp    The AIJ format (also called the Yale sparse matrix format or
1058f86e40fSKarl Rupp    compressed row storage), is fully compatible with standard Fortran 77
1068f86e40fSKarl Rupp    storage.  That is, the stored row and column indices can begin at
1078f86e40fSKarl Rupp    either one (as in Fortran) or zero.  See the users' manual for details.
1088f86e40fSKarl Rupp 
1098f86e40fSKarl Rupp    Specify the preallocated storage with either nz or nnz (not both).
1108f86e40fSKarl Rupp    Set nz=PETSC_DEFAULT and nnz=NULL for PETSc to control dynamic memory
1118f86e40fSKarl Rupp    allocation.  For large problems you MUST preallocate memory or you
1128f86e40fSKarl Rupp    will get TERRIBLE performance, see the users' manual chapter on matrices.
1138f86e40fSKarl Rupp 
1148f86e40fSKarl Rupp    Level: intermediate
1158f86e40fSKarl Rupp 
116e9e886b6SKarl Rupp .seealso: MatCreate(), MatCreateAIJ(), MatCreateAIJCUSPARSE(), MatSetValues(), MatSeqAIJSetColumnIndices(), MatCreateSeqAIJWithArrays(), MatCreateAIJ(), MATMPIAIJVIENNACL, MATAIJVIENNACL
1178f86e40fSKarl Rupp @*/
1188f86e40fSKarl 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)
1198f86e40fSKarl Rupp {
1208f86e40fSKarl Rupp   PetscErrorCode ierr;
1218f86e40fSKarl Rupp   PetscMPIInt    size;
1228f86e40fSKarl Rupp 
1238f86e40fSKarl Rupp   PetscFunctionBegin;
1248f86e40fSKarl Rupp   ierr = MatCreate(comm,A);CHKERRQ(ierr);
1258f86e40fSKarl Rupp   ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr);
126ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
1278f86e40fSKarl Rupp   if (size > 1) {
1288f86e40fSKarl Rupp     ierr = MatSetType(*A,MATMPIAIJVIENNACL);CHKERRQ(ierr);
1298f86e40fSKarl Rupp     ierr = MatMPIAIJSetPreallocation(*A,d_nz,d_nnz,o_nz,o_nnz);CHKERRQ(ierr);
1308f86e40fSKarl Rupp   } else {
1318f86e40fSKarl Rupp     ierr = MatSetType(*A,MATSEQAIJVIENNACL);CHKERRQ(ierr);
1328f86e40fSKarl Rupp     ierr = MatSeqAIJSetPreallocation(*A,d_nz,d_nnz);CHKERRQ(ierr);
1338f86e40fSKarl Rupp   }
1348f86e40fSKarl Rupp   PetscFunctionReturn(0);
1358f86e40fSKarl Rupp }
1368f86e40fSKarl Rupp 
1373ca39a21SBarry Smith /*MC
1388f86e40fSKarl Rupp    MATAIJVIENNACL - MATMPIAIJVIENNACL= "aijviennacl" = "mpiaijviennacl" - A matrix type to be used for sparse matrices.
1398f86e40fSKarl Rupp 
1408f86e40fSKarl Rupp    A matrix type (CSR format) whose data resides on GPUs.
1418f86e40fSKarl Rupp    All matrix calculations are performed using the ViennaCL library.
1428f86e40fSKarl Rupp 
1438f86e40fSKarl Rupp    This matrix type is identical to MATSEQAIJVIENNACL when constructed with a single process communicator,
1448f86e40fSKarl Rupp    and MATMPIAIJVIENNACL otherwise.  As a result, for single process communicators,
1458f86e40fSKarl Rupp    MatSeqAIJSetPreallocation is supported, and similarly MatMPIAIJSetPreallocation is supported
1468f86e40fSKarl Rupp    for communicators controlling multiple processes.  It is recommended that you call both of
1478f86e40fSKarl Rupp    the above preallocation routines for simplicity.
1488f86e40fSKarl Rupp 
1498f86e40fSKarl Rupp    Options Database Keys:
150a2b725a8SWilliam Gropp .  -mat_type mpiaijviennacl - sets the matrix type to "mpiaijviennacl" during a call to MatSetFromOptions()
1518f86e40fSKarl Rupp 
1528f86e40fSKarl Rupp   Level: beginner
1538f86e40fSKarl Rupp 
1548f86e40fSKarl Rupp  .seealso: MatCreateAIJViennaCL(), MATSEQAIJVIENNACL, MatCreateSeqAIJVIENNACL()
1558f86e40fSKarl Rupp M*/
156