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