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: }