Actual source code: ex32.c
petsc-3.12.1 2019-10-22
2: static char help[] = "Tests MATSEQDENSECUDA\n\n";
4: #include <petscmat.h>
6: int main(int argc,char **argv)
7: {
8: Mat A,AC,B;
10: PetscInt m = 10,n = 10;
11: PetscReal r,tol = 10*PETSC_SMALL;
13: PetscInitialize(&argc,&argv,(char*) 0,help);if (ierr) return ierr;
14: PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);
15: PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);
16: MatCreate(PETSC_COMM_SELF,&A);
17: MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,m,n);
18: MatSetType(A,MATSEQDENSE);
19: MatSetFromOptions(A);
20: MatSeqDenseSetPreallocation(A,NULL);
21: MatSetRandom(A,NULL);
23: /* Create a CUDA version of A */
24: MatConvert(A,MATSEQDENSECUDA,MAT_INITIAL_MATRIX,&AC);
25: MatDuplicate(AC,MAT_COPY_VALUES,&B);
27: /* full CUDA AXPY */
28: MatAXPY(B,-1.0,AC,SAME_NONZERO_PATTERN);
29: MatNorm(B,NORM_INFINITY,&r);
30: if (r != 0.0) SETERRQ1(PetscObjectComm((PetscObject)B),PETSC_ERR_PLIB,"Error MatDuplicate + MatCopy + MatAXPY %g",(double)r);
32: /* test Copy */
33: MatCopy(AC,B,SAME_NONZERO_PATTERN);
35: /* call MatAXPY_Basic since B is CUDA, A is CPU, */
36: MatAXPY(B,-1.0,A,SAME_NONZERO_PATTERN);
37: MatNorm(B,NORM_INFINITY,&r);
38: if (r != 0.0) SETERRQ1(PetscObjectComm((PetscObject)B),PETSC_ERR_PLIB,"Error MatDuplicate + MatCopy + MatAXPY_Basic %g",(double)r);
40: if (m == n) {
41: Mat B1,B2;
43: MatCopy(AC,B,SAME_NONZERO_PATTERN);
44: /* full CUDA PtAP */
45: MatPtAP(B,AC,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&B1);
46: /* CPU PtAP since A is on the CPU only */
47: MatPtAP(B,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&B2);
48: MatAXPY(B2,-1.0,B1,SAME_NONZERO_PATTERN);
49: MatNorm(B2,NORM_INFINITY,&r);
50: if (r > tol) SETERRQ1(PetscObjectComm((PetscObject)B),PETSC_ERR_PLIB,"Error MatPtAP %g",(double)r);
52: /* test reuse */
53: MatPtAP(B,AC,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B1);
54: MatPtAP(B,A,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B2);
55: MatAXPY(B2,-1.0,B1,SAME_NONZERO_PATTERN);
56: MatNorm(B2,NORM_INFINITY,&r);
57: if (r > tol) SETERRQ1(PetscObjectComm((PetscObject)B),PETSC_ERR_PLIB,"Error MatPtAP %g",(double)r);
59: MatDestroy(&B1);
60: MatDestroy(&B2);
61: }
63: MatDestroy(&B);
64: MatDestroy(&AC);
65: MatDestroy(&A);
66: PetscFinalize();
67: return ierr;
68: }
70: /*TEST
72: build:
73: requires: cuda
75: test:
76: output_file: output/ex32_1.out
77: args: -m {{3 5 12}} -n {{3 5 12}}
78: suffix: seqdensecuda
80: TEST*/