xref: /petsc/src/sys/objects/device/tests/ex1.c (revision a4af0ceea8a251db97ee0dc5c0d52d4adf50264a)
1*a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n";
2*a4af0ceeSJacob Faibussowitsch 
3*a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h>
4*a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
5*a4af0ceeSJacob Faibussowitsch 
6*a4af0ceeSJacob Faibussowitsch int main(int argc, char *argv[])
7*a4af0ceeSJacob Faibussowitsch {
8*a4af0ceeSJacob Faibussowitsch   const PetscInt n = 10;
9*a4af0ceeSJacob Faibussowitsch   PetscDevice    device = NULL;
10*a4af0ceeSJacob Faibussowitsch   PetscDevice    devices[n];
11*a4af0ceeSJacob Faibussowitsch   PetscErrorCode ierr;
12*a4af0ceeSJacob Faibussowitsch 
13*a4af0ceeSJacob Faibussowitsch   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
14*a4af0ceeSJacob Faibussowitsch 
15*a4af0ceeSJacob Faibussowitsch   /* normal create and destroy */
16*a4af0ceeSJacob Faibussowitsch   ierr = PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device);CHKERRQ(ierr);
17*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceExists(device);CHKERRQ(ierr);
18*a4af0ceeSJacob Faibussowitsch   ierr = PetscDeviceDestroy(&device);CHKERRQ(ierr);
19*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceDoesNotExist(device);CHKERRQ(ierr);
20*a4af0ceeSJacob Faibussowitsch   /* should not destroy twice */
21*a4af0ceeSJacob Faibussowitsch   ierr = PetscDeviceDestroy(&device);CHKERRQ(ierr);
22*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceDoesNotExist(device);CHKERRQ(ierr);
23*a4af0ceeSJacob Faibussowitsch 
24*a4af0ceeSJacob Faibussowitsch   /* test reference counting */
25*a4af0ceeSJacob Faibussowitsch   device = NULL;
26*a4af0ceeSJacob Faibussowitsch   ierr = PetscArrayzero(devices,n);CHKERRQ(ierr);
27*a4af0ceeSJacob Faibussowitsch   ierr = PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device);CHKERRQ(ierr);
28*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceExists(device);CHKERRQ(ierr);
29*a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
30*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceReference_Internal(device);CHKERRQ(ierr);
31*a4af0ceeSJacob Faibussowitsch     devices[i] = device;
32*a4af0ceeSJacob Faibussowitsch   }
33*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceExists(device);CHKERRQ(ierr);
34*a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
35*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceDestroy(&devices[i]);CHKERRQ(ierr);
36*a4af0ceeSJacob Faibussowitsch     ierr = AssertDeviceExists(device);CHKERRQ(ierr);
37*a4af0ceeSJacob Faibussowitsch     ierr = AssertDeviceDoesNotExist(devices[i]);CHKERRQ(ierr);
38*a4af0ceeSJacob Faibussowitsch   }
39*a4af0ceeSJacob Faibussowitsch   ierr = PetscDeviceDestroy(&device);CHKERRQ(ierr);
40*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceDoesNotExist(device);CHKERRQ(ierr);
41*a4af0ceeSJacob Faibussowitsch 
42*a4af0ceeSJacob Faibussowitsch   /* test the default devices exist */
43*a4af0ceeSJacob Faibussowitsch   device = NULL;
44*a4af0ceeSJacob Faibussowitsch   ierr = PetscArrayzero(devices,n);CHKERRQ(ierr);
45*a4af0ceeSJacob Faibussowitsch   {
46*a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
47*a4af0ceeSJacob Faibussowitsch     /* global context will have the default device */
48*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceContextGetCurrentContext(&dctx);CHKERRQ(ierr);
49*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceContextGetDevice(dctx,&device);CHKERRQ(ierr);
50*a4af0ceeSJacob Faibussowitsch   }
51*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceExists(device);CHKERRQ(ierr);
52*a4af0ceeSJacob Faibussowitsch   /* test reference counting for default device */
53*a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
54*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceReference_Internal(device);CHKERRQ(ierr);
55*a4af0ceeSJacob Faibussowitsch     devices[i] = device;
56*a4af0ceeSJacob Faibussowitsch   }
57*a4af0ceeSJacob Faibussowitsch   ierr = AssertDeviceExists(device);CHKERRQ(ierr);
58*a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
59*a4af0ceeSJacob Faibussowitsch     ierr = PetscDeviceDestroy(&devices[i]);CHKERRQ(ierr);
60*a4af0ceeSJacob Faibussowitsch     ierr = AssertDeviceExists(device);CHKERRQ(ierr);
61*a4af0ceeSJacob Faibussowitsch     ierr = AssertDeviceDoesNotExist(devices[i]);CHKERRQ(ierr);
62*a4af0ceeSJacob Faibussowitsch   }
63*a4af0ceeSJacob Faibussowitsch 
64*a4af0ceeSJacob Faibussowitsch   ierr = PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n");CHKERRQ(ierr);
65*a4af0ceeSJacob Faibussowitsch   ierr = PetscFinalize();
66*a4af0ceeSJacob Faibussowitsch   return ierr;
67*a4af0ceeSJacob Faibussowitsch }
68*a4af0ceeSJacob Faibussowitsch 
69*a4af0ceeSJacob Faibussowitsch /*TEST
70*a4af0ceeSJacob Faibussowitsch 
71*a4af0ceeSJacob Faibussowitsch  build:
72*a4af0ceeSJacob Faibussowitsch    requires: defined(PETSC_HAVE_CXX_DIALECT_CXX11)
73*a4af0ceeSJacob Faibussowitsch 
74*a4af0ceeSJacob Faibussowitsch  testset:
75*a4af0ceeSJacob Faibussowitsch    requires: !device
76*a4af0ceeSJacob Faibussowitsch    suffix: no_device
77*a4af0ceeSJacob Faibussowitsch    filter: Error: grep -E -o -e ".*No support for this operation for this object type" -e ".*PETSc is not configured with device support.*" -e "^\[0\]PETSC ERROR:.*[0-9]{1} [A-z]+\(\)"
78*a4af0ceeSJacob Faibussowitsch    test:
79*a4af0ceeSJacob Faibussowitsch      requires: debug
80*a4af0ceeSJacob Faibussowitsch      suffix:   debug
81*a4af0ceeSJacob Faibussowitsch    test:
82*a4af0ceeSJacob Faibussowitsch      requires: !debug
83*a4af0ceeSJacob Faibussowitsch      suffix:   opt
84*a4af0ceeSJacob Faibussowitsch 
85*a4af0ceeSJacob Faibussowitsch  testset:
86*a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
87*a4af0ceeSJacob Faibussowitsch    nsize: {{1 2 5}}
88*a4af0ceeSJacob Faibussowitsch    test:
89*a4af0ceeSJacob Faibussowitsch      requires: cuda
90*a4af0ceeSJacob Faibussowitsch      suffix: cuda
91*a4af0ceeSJacob Faibussowitsch    test:
92*a4af0ceeSJacob Faibussowitsch      requires: hip
93*a4af0ceeSJacob Faibussowitsch      suffix: hip
94*a4af0ceeSJacob Faibussowitsch 
95*a4af0ceeSJacob Faibussowitsch TEST*/
96