1 static char help[] = "Test MatDenseGetSubMatrix() on a CUDA matrix.\n"; 2 3 #include <petscmat.h> 4 5 int main(int argc, char **argv) 6 { 7 Mat A, B; 8 PetscScalar *b; 9 PetscInt n = 4, lda = 5, i, k; 10 PetscBool cuda = PETSC_FALSE; 11 12 PetscFunctionBeginUser; 13 PetscCall(PetscInitialize(&argc, &argv, 0, help)); 14 PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 15 PetscCall(PetscOptionsGetInt(NULL, NULL, "-lda", &lda, NULL)); 16 PetscCall(PetscOptionsGetBool(NULL, NULL, "-cuda", &cuda, NULL)); 17 PetscCheck(lda >= n, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "lda %" PetscInt_FMT " < n %" PetscInt_FMT, lda, n); 18 19 #if defined(PETSC_HAVE_CUDA) 20 if (cuda) PetscCall(MatCreateSeqDenseCUDA(PETSC_COMM_SELF, lda, n, NULL, &A)); 21 else 22 #endif 23 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, lda, n, NULL, &A)); 24 25 for (k = 0; k < 3; k++) { 26 PetscCall(MatDenseGetSubMatrix(A, 0, n, 0, n, &B)); 27 PetscCall(MatDenseGetArray(B, &b)); 28 for (i = 0; i < n; i++) { 29 b[i + i * lda] = 2.0 * (i + 1); 30 if (i > 0) b[i + (i - 1) * lda] = (PetscReal)(k + 1); 31 } 32 PetscCall(MatDenseRestoreArray(B, &b)); 33 PetscCall(MatDenseRestoreSubMatrix(A, &B)); 34 PetscCall(MatView(A, NULL)); 35 } 36 37 PetscCall(MatDestroy(&A)); 38 PetscCall(PetscFinalize()); 39 return 0; 40 } 41 42 /*TEST 43 44 testset: 45 output_file: output/ex257_1.out 46 diff_args: -j 47 test: 48 suffix: 1 49 test: 50 suffix: 1_cuda 51 args: -cuda 52 requires: cuda 53 filter: sed -e "s/seqdensecuda/seqdense/" 54 55 TEST*/ 56