xref: /petsc/src/sys/objects/device/tests/ex1.c (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
4a4af0ceeSJacob Faibussowitsch 
59371c9d4SSatish Balay int main(int argc, char *argv[]) {
6a4af0ceeSJacob Faibussowitsch   const PetscInt n      = 10;
7a4af0ceeSJacob Faibussowitsch   PetscDevice    device = NULL;
8a4af0ceeSJacob Faibussowitsch   PetscDevice    devices[n];
9a4af0ceeSJacob Faibussowitsch 
10327415f7SBarry Smith   PetscFunctionBeginUser;
119566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
12a4af0ceeSJacob Faibussowitsch 
13a4af0ceeSJacob Faibussowitsch   /* normal create and destroy */
14*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
159566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
169566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
179566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
18a4af0ceeSJacob Faibussowitsch   /* should not destroy twice */
199566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
209566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
21a4af0ceeSJacob Faibussowitsch 
22a4af0ceeSJacob Faibussowitsch   /* test reference counting */
23a4af0ceeSJacob Faibussowitsch   device = NULL;
249566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(devices, n));
25*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
269566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
27a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
289566063dSJacob Faibussowitsch     PetscCall(PetscDeviceReference_Internal(device));
29a4af0ceeSJacob Faibussowitsch     devices[i] = device;
30a4af0ceeSJacob Faibussowitsch   }
319566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
32a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
339566063dSJacob Faibussowitsch     PetscCall(PetscDeviceDestroy(&devices[i]));
349566063dSJacob Faibussowitsch     PetscCall(AssertDeviceExists(device));
359566063dSJacob Faibussowitsch     PetscCall(AssertDeviceDoesNotExist(devices[i]));
36a4af0ceeSJacob Faibussowitsch   }
379566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
389566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
39a4af0ceeSJacob Faibussowitsch 
40a4af0ceeSJacob Faibussowitsch   /* test the default devices exist */
41a4af0ceeSJacob Faibussowitsch   device = NULL;
429566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(devices, n));
43a4af0ceeSJacob Faibussowitsch   {
44a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
45a4af0ceeSJacob Faibussowitsch     /* global context will have the default device */
469566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
479566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(dctx, &device));
48a4af0ceeSJacob Faibussowitsch   }
499566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
50a4af0ceeSJacob Faibussowitsch   /* test reference counting for default device */
51a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
529566063dSJacob Faibussowitsch     PetscCall(PetscDeviceReference_Internal(device));
53a4af0ceeSJacob Faibussowitsch     devices[i] = device;
54a4af0ceeSJacob Faibussowitsch   }
559566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
56a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
579566063dSJacob Faibussowitsch     PetscCall(PetscDeviceDestroy(&devices[i]));
589566063dSJacob Faibussowitsch     PetscCall(AssertDeviceExists(device));
599566063dSJacob Faibussowitsch     PetscCall(AssertDeviceDoesNotExist(devices[i]));
60a4af0ceeSJacob Faibussowitsch   }
61a4af0ceeSJacob Faibussowitsch 
629566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
639566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
64b122ec5aSJacob Faibussowitsch   return 0;
65a4af0ceeSJacob Faibussowitsch }
66a4af0ceeSJacob Faibussowitsch 
67a4af0ceeSJacob Faibussowitsch /*TEST
68a4af0ceeSJacob Faibussowitsch 
69a4af0ceeSJacob Faibussowitsch  build:
70cb9b7bb0SJacob Faibussowitsch    requires: defined(PETSC_HAVE_CXX)
71a4af0ceeSJacob Faibussowitsch 
72a4af0ceeSJacob Faibussowitsch  testset:
73a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
74a4af0ceeSJacob Faibussowitsch    nsize: {{1 2 5}}
75*0e6b6b59SJacob Faibussowitsch    args: -device_enable {{lazy eager}}
76*0e6b6b59SJacob Faibussowitsch    test:
77*0e6b6b59SJacob Faibussowitsch      requires: !device
78*0e6b6b59SJacob Faibussowitsch      suffix: host_no_device
79*0e6b6b59SJacob Faibussowitsch    test:
80*0e6b6b59SJacob Faibussowitsch      requires: device
81*0e6b6b59SJacob Faibussowitsch      args: -default_device_type host
82*0e6b6b59SJacob Faibussowitsch      suffix: host_with_device
83a4af0ceeSJacob Faibussowitsch    test:
84a4af0ceeSJacob Faibussowitsch      requires: cuda
85*0e6b6b59SJacob Faibussowitsch      args: -default_device_type cuda
86a4af0ceeSJacob Faibussowitsch      suffix: cuda
87a4af0ceeSJacob Faibussowitsch    test:
88a4af0ceeSJacob Faibussowitsch      requires: hip
89*0e6b6b59SJacob Faibussowitsch      args: -default_device_type hip
90a4af0ceeSJacob Faibussowitsch      suffix: hip
91a2158755SJunchao Zhang    test:
92a2158755SJunchao Zhang      requires: sycl
93*0e6b6b59SJacob Faibussowitsch      args: -default_device_type sycl
94a2158755SJunchao Zhang      suffix: sycl
95a4af0ceeSJacob Faibussowitsch 
96a4af0ceeSJacob Faibussowitsch TEST*/
97