Actual source code: mpibaijlibxsmm.c

  1: #include <../src/mat/impls/baij/mpi/mpibaij.h>

  3: static PetscErrorCode MatMPIBAIJSetPreallocation_MPIBAIJLIBXSMM(Mat B, PetscInt bs, PetscInt d_nz, const PetscInt *d_nnz, PetscInt o_nz, const PetscInt *o_nnz)
  4: {
  5:   Mat_MPIBAIJ *baij = (Mat_MPIBAIJ *)B->data;

  7:   PetscFunctionBegin;
  8:   PetscCall(MatMPIBAIJSetPreallocation_MPIBAIJ(B, bs, d_nz, d_nnz, o_nz, o_nnz));
  9:   PetscCall(MatConvert(baij->A, MATSEQBAIJLIBXSMM, MAT_INPLACE_MATRIX, &baij->A));
 10:   PetscCall(MatConvert(baij->B, MATSEQBAIJLIBXSMM, MAT_INPLACE_MATRIX, &baij->B));
 11:   PetscFunctionReturn(PETSC_SUCCESS);
 12: }

 14: PETSC_INTERN PetscErrorCode MatConvert_MPIBAIJLIBXSMM_MPIBAIJ(Mat A, MatType type, MatReuse reuse, Mat *newmat)
 15: {
 16:   Mat          B = *newmat;
 17:   Mat_MPIBAIJ *baij;

 19:   PetscFunctionBegin;
 20:   if (reuse == MAT_INITIAL_MATRIX) PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &B));
 21:   baij = (Mat_MPIBAIJ *)B->data;
 22:   if (baij->A) PetscCall(MatConvert(baij->A, MATSEQBAIJ, MAT_INPLACE_MATRIX, &baij->A));
 23:   if (baij->B) PetscCall(MatConvert(baij->B, MATSEQBAIJ, MAT_INPLACE_MATRIX, &baij->B));
 24:   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatMPIBAIJSetPreallocation_C", MatMPIBAIJSetPreallocation_MPIBAIJ));
 25:   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatProductSetFromOptions_mpibaijlibxsmm_mpidense_C", NULL));
 26:   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatConvert_mpibaijlibxsmm_mpibaij_C", NULL));
 27:   PetscCall(PetscObjectChangeTypeName((PetscObject)B, MATMPIBAIJ));
 28:   *newmat = B;
 29:   PetscFunctionReturn(PETSC_SUCCESS);
 30: }

 32: PETSC_INTERN PetscErrorCode MatConvert_MPIBAIJ_MPIBAIJLIBXSMM(Mat A, MatType type, MatReuse reuse, Mat *newmat)
 33: {
 34:   Mat          B = *newmat;
 35:   Mat_MPIBAIJ *baij;
 36:   PetscBool    sametype;

 38:   PetscFunctionBegin;
 39:   if (reuse == MAT_INITIAL_MATRIX) PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &B));
 40:   PetscCall(PetscObjectTypeCompare((PetscObject)B, MATMPIBAIJLIBXSMM, &sametype));
 41:   if (!sametype) {
 42:     baij = (Mat_MPIBAIJ *)B->data;
 43:     if (baij->A) PetscCall(MatConvert(baij->A, MATSEQBAIJLIBXSMM, MAT_INPLACE_MATRIX, &baij->A));
 44:     if (baij->B) PetscCall(MatConvert(baij->B, MATSEQBAIJLIBXSMM, MAT_INPLACE_MATRIX, &baij->B));
 45:     PetscCall(PetscObjectChangeTypeName((PetscObject)B, MATMPIBAIJLIBXSMM));
 46:     PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatMPIBAIJSetPreallocation_C", MatMPIBAIJSetPreallocation_MPIBAIJLIBXSMM));
 47:     PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatProductSetFromOptions_mpibaijlibxsmm_mpidense_C", MatProductSetFromOptions_MPIBAIJ_MPIDense));
 48:     PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatConvert_mpibaijlibxsmm_mpibaij_C", MatConvert_MPIBAIJLIBXSMM_MPIBAIJ));
 49:   }
 50:   *newmat = B;
 51:   PetscFunctionReturn(PETSC_SUCCESS);
 52: }

 54: /*MC
 55:    MATMPIBAIJLIBXSMM - "mpibaijlibxsmm" - A distributed block sparse matrix that uses LIBXSMM kernels for products with `MATMPIDENSE` matrices

 57:    Options Database Key:
 58: . -mat_type mpibaijlibxsmm - sets the matrix type to `MATMPIBAIJLIBXSMM` during a call to `MatSetFromOptions()`

 60:    Level: beginner

 62:    Notes:
 63:    This matrix type is available when PETSc is configured with `--download-libxsmm` or `--with-libxsmm-dir=directory`.

 65:    It has the same storage format and supports the same operations as `MATMPIBAIJ`.

 67: .seealso: [](ch_matrices), `Mat`, `MATBAIJLIBXSMM`, `MATSEQBAIJLIBXSMM`, `MATMPIBAIJ`, `MatMatMult()`
 68: M*/

 70: /*MC
 71:    MATBAIJLIBXSMM - "baijlibxsmm" - A block sparse matrix that uses LIBXSMM kernels for products with dense matrices

 73:    Options Database Key:
 74: . -mat_type baijlibxsmm - sets the matrix type to `MATBAIJLIBXSMM` during a call to `MatSetFromOptions()`

 76:    Level: beginner

 78:    Notes:
 79:    This matrix type is `MATSEQBAIJLIBXSMM` on a single-process communicator and `MATMPIBAIJLIBXSMM` otherwise.

 81:    This matrix type is available when PETSc is configured with `--download-libxsmm` or `--with-libxsmm-dir=directory`.

 83: .seealso: [](ch_matrices), `Mat`, `MATSEQBAIJLIBXSMM`, `MATMPIBAIJLIBXSMM`, `MATBAIJ`, `MatMatMult()`
 84: M*/
 85: PETSC_EXTERN PetscErrorCode MatCreate_MPIBAIJLIBXSMM(Mat A)
 86: {
 87:   PetscFunctionBegin;
 88:   PetscCall(MatSetType(A, MATMPIBAIJ));
 89:   PetscCall(MatConvert_MPIBAIJ_MPIBAIJLIBXSMM(A, MATMPIBAIJLIBXSMM, MAT_INPLACE_MATRIX, &A));
 90:   PetscFunctionReturn(PETSC_SUCCESS);
 91: }