xref: /petsc/src/mat/impls/aij/mpi/mpiviennacl/mpiaijviennacl.cxx (revision 023073b3e9f5f67a417c10d95dd9f12e62bc1d2b)
18f86e40fSKarl Rupp #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 #undef __FUNCT__
68f86e40fSKarl Rupp #define __FUNCT__ "MatMPIAIJSetPreallocation_MPIAIJViennaCL"
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   PetscInt       i;
128f86e40fSKarl Rupp 
138f86e40fSKarl Rupp   PetscFunctionBegin;
148f86e40fSKarl Rupp   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
158f86e40fSKarl Rupp   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
168f86e40fSKarl Rupp   if (!B->preallocated) {
178f86e40fSKarl Rupp     /* Explicitly create the two MATSEQAIJVIENNACL matrices. */
188f86e40fSKarl Rupp     ierr = MatCreate(PETSC_COMM_SELF,&b->A);CHKERRQ(ierr);
198f86e40fSKarl Rupp     ierr = MatSetSizes(b->A,B->rmap->n,B->cmap->n,B->rmap->n,B->cmap->n);CHKERRQ(ierr);
208f86e40fSKarl Rupp     ierr = MatSetType(b->A,MATSEQAIJVIENNACL);CHKERRQ(ierr);
218f86e40fSKarl Rupp     ierr = PetscLogObjectParent(B,b->A);CHKERRQ(ierr);
228f86e40fSKarl Rupp     ierr = MatCreate(PETSC_COMM_SELF,&b->B);CHKERRQ(ierr);
238f86e40fSKarl Rupp     ierr = MatSetSizes(b->B,B->rmap->n,B->cmap->N,B->rmap->n,B->cmap->N);CHKERRQ(ierr);
248f86e40fSKarl Rupp     ierr = MatSetType(b->B,MATSEQAIJVIENNACL);CHKERRQ(ierr);
258f86e40fSKarl Rupp     ierr = PetscLogObjectParent(B,b->B);CHKERRQ(ierr);
268f86e40fSKarl Rupp   }
278f86e40fSKarl Rupp   ierr = MatSeqAIJSetPreallocation(b->A,d_nz,d_nnz);CHKERRQ(ierr);
288f86e40fSKarl Rupp   ierr = MatSeqAIJSetPreallocation(b->B,o_nz,o_nnz);CHKERRQ(ierr);
298f86e40fSKarl Rupp   B->preallocated = PETSC_TRUE;
308f86e40fSKarl Rupp   PetscFunctionReturn(0);
318f86e40fSKarl Rupp }
328f86e40fSKarl Rupp 
338f86e40fSKarl Rupp #undef __FUNCT__
348f86e40fSKarl Rupp #define __FUNCT__ "MatGetVecs_MPIAIJViennaCL"
358f86e40fSKarl Rupp PetscErrorCode  MatGetVecs_MPIAIJViennaCL(Mat mat,Vec *right,Vec *left)
368f86e40fSKarl Rupp {
378f86e40fSKarl Rupp   PetscErrorCode ierr;
388f86e40fSKarl Rupp 
398f86e40fSKarl Rupp   PetscFunctionBegin;
408f86e40fSKarl Rupp   if (right) {
418f86e40fSKarl Rupp     ierr = VecCreate(PetscObjectComm((PetscObject)mat),right);CHKERRQ(ierr);
428f86e40fSKarl Rupp     ierr = VecSetSizes(*right,mat->cmap->n,PETSC_DETERMINE);CHKERRQ(ierr);
438f86e40fSKarl Rupp     ierr = VecSetBlockSize(*right,mat->rmap->bs);CHKERRQ(ierr);
448f86e40fSKarl Rupp     ierr = VecSetType(*right,VECVIENNACL);CHKERRQ(ierr);
458f86e40fSKarl Rupp     ierr = VecSetLayout(*right,mat->cmap);CHKERRQ(ierr);
468f86e40fSKarl Rupp   }
478f86e40fSKarl Rupp   if (left) {
488f86e40fSKarl Rupp     ierr = VecCreate(PetscObjectComm((PetscObject)mat),left);CHKERRQ(ierr);
498f86e40fSKarl Rupp     ierr = VecSetSizes(*left,mat->rmap->n,PETSC_DETERMINE);CHKERRQ(ierr);
508f86e40fSKarl Rupp     ierr = VecSetBlockSize(*left,mat->rmap->bs);CHKERRQ(ierr);
518f86e40fSKarl Rupp     ierr = VecSetType(*left,VECVIENNACL);CHKERRQ(ierr);
528f86e40fSKarl Rupp     ierr = VecSetLayout(*left,mat->rmap);CHKERRQ(ierr);
538f86e40fSKarl Rupp   }
548f86e40fSKarl Rupp   PetscFunctionReturn(0);
558f86e40fSKarl Rupp }
568f86e40fSKarl Rupp 
578f86e40fSKarl Rupp 
588f86e40fSKarl Rupp #undef __FUNCT__
598f86e40fSKarl Rupp #define __FUNCT__ "MatDestroy_MPIAIJViennaCL"
608f86e40fSKarl Rupp PetscErrorCode MatDestroy_MPIAIJViennaCL(Mat A)
618f86e40fSKarl Rupp {
628f86e40fSKarl Rupp   PetscErrorCode ierr;
638f86e40fSKarl Rupp 
648f86e40fSKarl Rupp   PetscFunctionBegin;
658f86e40fSKarl Rupp   ierr = MatDestroy_MPIAIJ(A);CHKERRQ(ierr);
668f86e40fSKarl Rupp   PetscFunctionReturn(0);
678f86e40fSKarl Rupp }
688f86e40fSKarl Rupp 
698f86e40fSKarl Rupp #undef __FUNCT__
708f86e40fSKarl Rupp #define __FUNCT__ "MatCreate_MPIAIJViennaCL"
718f86e40fSKarl Rupp PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJViennaCL(Mat A)
728f86e40fSKarl Rupp {
738f86e40fSKarl Rupp   PetscErrorCode ierr;
748f86e40fSKarl Rupp 
758f86e40fSKarl Rupp   PetscFunctionBegin;
768f86e40fSKarl Rupp   ierr = MatCreate_MPIAIJ(A);CHKERRQ(ierr);
77ab6435e1SKarl Rupp   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMPIAIJSetPreallocation_C",MatMPIAIJSetPreallocation_MPIAIJViennaCL);CHKERRQ(ierr);
788f86e40fSKarl Rupp   A->ops->getvecs        = MatGetVecs_MPIAIJViennaCL;
798f86e40fSKarl Rupp 
8065e3cb35SKarl Rupp   ierr = MatSetFromOptions_SeqViennaCL(A);CHKERRQ(ierr); /* Allows to set device type before allocating any objects */
818f86e40fSKarl Rupp   ierr = PetscObjectChangeTypeName((PetscObject)A,MATMPIAIJVIENNACL);CHKERRQ(ierr);
828f86e40fSKarl Rupp   PetscFunctionReturn(0);
838f86e40fSKarl Rupp }
848f86e40fSKarl Rupp 
858f86e40fSKarl Rupp 
868f86e40fSKarl Rupp /*@
878f86e40fSKarl Rupp    MatCreateAIJViennaCL - Creates a sparse matrix in AIJ (compressed row) format
88*023073b3SKarl Rupp    (the default parallel PETSc format).  This matrix will ultimately be pushed down
898f86e40fSKarl Rupp    to GPUs and use the ViennaCL library for calculations. For good matrix
908f86e40fSKarl Rupp    assembly performance the user should preallocate the matrix storage by setting
918f86e40fSKarl Rupp    the parameter nz (or the array nnz).  By setting these parameters accurately,
928f86e40fSKarl Rupp    performance during matrix assembly can be increased substantially.
938f86e40fSKarl Rupp 
948f86e40fSKarl Rupp 
958f86e40fSKarl Rupp    Collective on MPI_Comm
968f86e40fSKarl Rupp 
978f86e40fSKarl Rupp    Input Parameters:
988f86e40fSKarl Rupp +  comm - MPI communicator, set to PETSC_COMM_SELF
998f86e40fSKarl Rupp .  m - number of rows
1008f86e40fSKarl Rupp .  n - number of columns
1018f86e40fSKarl Rupp .  nz - number of nonzeros per row (same for all rows)
1028f86e40fSKarl Rupp -  nnz - array containing the number of nonzeros in the various rows
1038f86e40fSKarl Rupp          (possibly different for each row) or NULL
1048f86e40fSKarl Rupp 
1058f86e40fSKarl Rupp    Output Parameter:
1068f86e40fSKarl Rupp .  A - the matrix
1078f86e40fSKarl Rupp 
1088f86e40fSKarl Rupp    It is recommended that one use the MatCreate(), MatSetType() and/or MatSetFromOptions(),
1098f86e40fSKarl Rupp    MatXXXXSetPreallocation() paradigm instead of this routine directly.
1108f86e40fSKarl Rupp    [MatXXXXSetPreallocation() is, for example, MatSeqAIJSetPreallocation]
1118f86e40fSKarl Rupp 
1128f86e40fSKarl Rupp    Notes:
1138f86e40fSKarl Rupp    If nnz is given then nz is ignored
1148f86e40fSKarl Rupp 
1158f86e40fSKarl Rupp    The AIJ format (also called the Yale sparse matrix format or
1168f86e40fSKarl Rupp    compressed row storage), is fully compatible with standard Fortran 77
1178f86e40fSKarl Rupp    storage.  That is, the stored row and column indices can begin at
1188f86e40fSKarl Rupp    either one (as in Fortran) or zero.  See the users' manual for details.
1198f86e40fSKarl Rupp 
1208f86e40fSKarl Rupp    Specify the preallocated storage with either nz or nnz (not both).
1218f86e40fSKarl Rupp    Set nz=PETSC_DEFAULT and nnz=NULL for PETSc to control dynamic memory
1228f86e40fSKarl Rupp    allocation.  For large problems you MUST preallocate memory or you
1238f86e40fSKarl Rupp    will get TERRIBLE performance, see the users' manual chapter on matrices.
1248f86e40fSKarl Rupp 
1258f86e40fSKarl Rupp    Level: intermediate
1268f86e40fSKarl Rupp 
1278f86e40fSKarl Rupp .seealso: MatCreate(), MatCreateAIJ(), MatCreateAIJCUSP(), MatSetValues(), MatSeqAIJSetColumnIndices(), MatCreateSeqAIJWithArrays(), MatCreateAIJ(), MATMPIAIJVIENNACL, MATAIJVIENNACL
1288f86e40fSKarl Rupp @*/
1298f86e40fSKarl Rupp #undef __FUNCT__
1308f86e40fSKarl Rupp #define __FUNCT__ "MatCreateAIJViennaCL"
1318f86e40fSKarl 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)
1328f86e40fSKarl Rupp {
1338f86e40fSKarl Rupp   PetscErrorCode ierr;
1348f86e40fSKarl Rupp   PetscMPIInt    size;
1358f86e40fSKarl Rupp 
1368f86e40fSKarl Rupp   PetscFunctionBegin;
1378f86e40fSKarl Rupp   ierr = MatCreate(comm,A);CHKERRQ(ierr);
1388f86e40fSKarl Rupp   ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr);
1398f86e40fSKarl Rupp   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
1408f86e40fSKarl Rupp   if (size > 1) {
1418f86e40fSKarl Rupp     ierr = MatSetType(*A,MATMPIAIJVIENNACL);CHKERRQ(ierr);
1428f86e40fSKarl Rupp     ierr = MatMPIAIJSetPreallocation(*A,d_nz,d_nnz,o_nz,o_nnz);CHKERRQ(ierr);
1438f86e40fSKarl Rupp   } else {
1448f86e40fSKarl Rupp     ierr = MatSetType(*A,MATSEQAIJVIENNACL);CHKERRQ(ierr);
1458f86e40fSKarl Rupp     ierr = MatSeqAIJSetPreallocation(*A,d_nz,d_nnz);CHKERRQ(ierr);
1468f86e40fSKarl Rupp   }
1478f86e40fSKarl Rupp   PetscFunctionReturn(0);
1488f86e40fSKarl Rupp }
1498f86e40fSKarl Rupp 
1508f86e40fSKarl Rupp /*M
1518f86e40fSKarl Rupp    MATAIJVIENNACL - MATMPIAIJVIENNACL= "aijviennacl" = "mpiaijviennacl" - A matrix type to be used for sparse matrices.
1528f86e40fSKarl Rupp 
1538f86e40fSKarl Rupp    A matrix type (CSR format) whose data resides on GPUs.
1548f86e40fSKarl Rupp    All matrix calculations are performed using the ViennaCL library.
1558f86e40fSKarl Rupp 
1568f86e40fSKarl Rupp    This matrix type is identical to MATSEQAIJVIENNACL when constructed with a single process communicator,
1578f86e40fSKarl Rupp    and MATMPIAIJVIENNACL otherwise.  As a result, for single process communicators,
1588f86e40fSKarl Rupp    MatSeqAIJSetPreallocation is supported, and similarly MatMPIAIJSetPreallocation is supported
1598f86e40fSKarl Rupp    for communicators controlling multiple processes.  It is recommended that you call both of
1608f86e40fSKarl Rupp    the above preallocation routines for simplicity.
1618f86e40fSKarl Rupp 
1628f86e40fSKarl Rupp    Options Database Keys:
1638f86e40fSKarl Rupp +  -mat_type mpiaijviennacl - sets the matrix type to "mpiaijviennacl" during a call to MatSetFromOptions()
1648f86e40fSKarl Rupp 
1658f86e40fSKarl Rupp   Level: beginner
1668f86e40fSKarl Rupp 
1678f86e40fSKarl Rupp  .seealso: MatCreateAIJViennaCL(), MATSEQAIJVIENNACL, MatCreateSeqAIJVIENNACL()
1688f86e40fSKarl Rupp M*/
1698f86e40fSKarl Rupp 
170