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