xref: /petsc/src/sys/objects/device/tests/ex1.c (revision f9fea11e2c44c506c9f9a3f6998afbe8a760174b)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
4a4af0ceeSJacob Faibussowitsch 
5d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[])
6d71ae5a4SJacob Faibussowitsch {
7a4af0ceeSJacob Faibussowitsch   const PetscInt n      = 10;
8a4af0ceeSJacob Faibussowitsch   PetscDevice    device = NULL;
9a4af0ceeSJacob Faibussowitsch   PetscDevice    devices[n];
10a4af0ceeSJacob Faibussowitsch 
11327415f7SBarry Smith   PetscFunctionBeginUser;
129566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
13a4af0ceeSJacob Faibussowitsch 
14a4af0ceeSJacob Faibussowitsch   /* normal create and destroy */
150e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
169566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
179566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
189566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
19a4af0ceeSJacob Faibussowitsch   /* should not destroy twice */
209566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
219566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
22a4af0ceeSJacob Faibussowitsch 
23a4af0ceeSJacob Faibussowitsch   /* test reference counting */
24a4af0ceeSJacob Faibussowitsch   device = NULL;
259566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(devices, n));
260e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
279566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
28a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
299566063dSJacob Faibussowitsch     PetscCall(PetscDeviceReference_Internal(device));
30a4af0ceeSJacob Faibussowitsch     devices[i] = device;
31a4af0ceeSJacob Faibussowitsch   }
329566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
33a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
349566063dSJacob Faibussowitsch     PetscCall(PetscDeviceDestroy(&devices[i]));
359566063dSJacob Faibussowitsch     PetscCall(AssertDeviceExists(device));
369566063dSJacob Faibussowitsch     PetscCall(AssertDeviceDoesNotExist(devices[i]));
37a4af0ceeSJacob Faibussowitsch   }
389566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
399566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
40a4af0ceeSJacob Faibussowitsch 
41a4af0ceeSJacob Faibussowitsch   /* test the default devices exist */
42a4af0ceeSJacob Faibussowitsch   device = NULL;
439566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(devices, n));
44a4af0ceeSJacob Faibussowitsch   {
45a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
46a4af0ceeSJacob Faibussowitsch     /* global context will have the default device */
479566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
489566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(dctx, &device));
49a4af0ceeSJacob Faibussowitsch   }
509566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
51a4af0ceeSJacob Faibussowitsch   /* test reference counting for default device */
52a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
539566063dSJacob Faibussowitsch     PetscCall(PetscDeviceReference_Internal(device));
54a4af0ceeSJacob Faibussowitsch     devices[i] = device;
55a4af0ceeSJacob Faibussowitsch   }
569566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
57a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
589566063dSJacob Faibussowitsch     PetscCall(PetscDeviceDestroy(&devices[i]));
599566063dSJacob Faibussowitsch     PetscCall(AssertDeviceExists(device));
609566063dSJacob Faibussowitsch     PetscCall(AssertDeviceDoesNotExist(devices[i]));
61a4af0ceeSJacob Faibussowitsch   }
62a4af0ceeSJacob Faibussowitsch 
639566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
649566063dSJacob 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:
74a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
75a4af0ceeSJacob Faibussowitsch    nsize: {{1 2 5}}
76*f9fea11eSJacob Faibussowitsch    args: -device_enable {{none lazy eager}}
770e6b6b59SJacob Faibussowitsch    test:
780e6b6b59SJacob Faibussowitsch      requires: !device
790e6b6b59SJacob Faibussowitsch      suffix: host_no_device
800e6b6b59SJacob Faibussowitsch    test:
810e6b6b59SJacob Faibussowitsch      requires: device
820e6b6b59SJacob Faibussowitsch      args: -default_device_type host
830e6b6b59SJacob Faibussowitsch      suffix: host_with_device
84a4af0ceeSJacob Faibussowitsch    test:
85a4af0ceeSJacob Faibussowitsch      requires: cuda
860e6b6b59SJacob Faibussowitsch      args: -default_device_type cuda
87a4af0ceeSJacob Faibussowitsch      suffix: cuda
88a4af0ceeSJacob Faibussowitsch    test:
89a4af0ceeSJacob Faibussowitsch      requires: hip
900e6b6b59SJacob Faibussowitsch      args: -default_device_type hip
91a4af0ceeSJacob Faibussowitsch      suffix: hip
92a2158755SJunchao Zhang    test:
93a2158755SJunchao Zhang      requires: sycl
940e6b6b59SJacob Faibussowitsch      args: -default_device_type sycl
95a2158755SJunchao Zhang      suffix: sycl
96a4af0ceeSJacob Faibussowitsch 
97a4af0ceeSJacob Faibussowitsch TEST*/
98