xref: /petsc/src/sys/objects/device/tests/ex1.c (revision 017deb10d530c1b6d9744fcd772cd96c5fcd74f2)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
4a4af0ceeSJacob Faibussowitsch 
main(int argc,char * argv[])5d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[])
6d71ae5a4SJacob Faibussowitsch {
7a4af0ceeSJacob Faibussowitsch   const PetscInt n      = 10;
8a4af0ceeSJacob Faibussowitsch   PetscDevice    device = NULL;
9667ab0feSJacob Faibussowitsch   PetscDevice    devices[10];
10a4af0ceeSJacob Faibussowitsch 
11327415f7SBarry Smith   PetscFunctionBeginUser;
129566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
13667ab0feSJacob Faibussowitsch   // would have just done
14667ab0feSJacob Faibussowitsch   //
15667ab0feSJacob Faibussowitsch   // const PetscInt n = 10;
16667ab0feSJacob Faibussowitsch   // PetscDevice devices[n];
17667ab0feSJacob Faibussowitsch   //
18667ab0feSJacob Faibussowitsch   // but alas the reliably insane MSVC balks at this to the tune of
19667ab0feSJacob Faibussowitsch   // 'ex1.c(9): error C2057: expected constant expression'. So instead we have a runtime check
20667ab0feSJacob Faibussowitsch   PetscCheck(PETSC_STATIC_ARRAY_LENGTH(devices) == n, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Forgot to update n");
21a4af0ceeSJacob Faibussowitsch 
22a4af0ceeSJacob Faibussowitsch   /* normal create and destroy */
230e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
249566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
259566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
269566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
27a4af0ceeSJacob Faibussowitsch   /* should not destroy twice */
289566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
299566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
30a4af0ceeSJacob Faibussowitsch 
31a4af0ceeSJacob Faibussowitsch   /* test reference counting */
32a4af0ceeSJacob Faibussowitsch   device = NULL;
339566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(devices, n));
340e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
359566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
36a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
379566063dSJacob Faibussowitsch     PetscCall(PetscDeviceReference_Internal(device));
38a4af0ceeSJacob Faibussowitsch     devices[i] = device;
39a4af0ceeSJacob Faibussowitsch   }
409566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
41a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
429566063dSJacob Faibussowitsch     PetscCall(PetscDeviceDestroy(&devices[i]));
439566063dSJacob Faibussowitsch     PetscCall(AssertDeviceExists(device));
449566063dSJacob Faibussowitsch     PetscCall(AssertDeviceDoesNotExist(devices[i]));
45a4af0ceeSJacob Faibussowitsch   }
469566063dSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
479566063dSJacob Faibussowitsch   PetscCall(AssertDeviceDoesNotExist(device));
48a4af0ceeSJacob Faibussowitsch 
49a4af0ceeSJacob Faibussowitsch   /* test the default devices exist */
50a4af0ceeSJacob Faibussowitsch   device = NULL;
519566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(devices, n));
52a4af0ceeSJacob Faibussowitsch   {
53a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
54a4af0ceeSJacob Faibussowitsch     /* global context will have the default device */
559566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
569566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(dctx, &device));
57a4af0ceeSJacob Faibussowitsch   }
589566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
59a4af0ceeSJacob Faibussowitsch   /* test reference counting for default device */
60a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
619566063dSJacob Faibussowitsch     PetscCall(PetscDeviceReference_Internal(device));
62a4af0ceeSJacob Faibussowitsch     devices[i] = device;
63a4af0ceeSJacob Faibussowitsch   }
649566063dSJacob Faibussowitsch   PetscCall(AssertDeviceExists(device));
65a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
669566063dSJacob Faibussowitsch     PetscCall(PetscDeviceDestroy(&devices[i]));
679566063dSJacob Faibussowitsch     PetscCall(AssertDeviceExists(device));
689566063dSJacob Faibussowitsch     PetscCall(AssertDeviceDoesNotExist(devices[i]));
69a4af0ceeSJacob Faibussowitsch   }
70a4af0ceeSJacob Faibussowitsch 
719566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
729566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
73b122ec5aSJacob Faibussowitsch   return 0;
74a4af0ceeSJacob Faibussowitsch }
75a4af0ceeSJacob Faibussowitsch 
76a4af0ceeSJacob Faibussowitsch /*TEST
77a4af0ceeSJacob Faibussowitsch 
78a4af0ceeSJacob Faibussowitsch   testset:
79*27d4e10aSPierre Jolivet     requires: defined(PETSC_DEVICELANGUAGE_CXX)
8061c8d4edSPierre Jolivet     output_file: output/ExitSuccess.out
81a4af0ceeSJacob Faibussowitsch     nsize: {{1 2 5}}
82f9fea11eSJacob Faibussowitsch     args: -device_enable {{none lazy eager}}
830e6b6b59SJacob Faibussowitsch     test:
840e6b6b59SJacob Faibussowitsch       requires: !device
850e6b6b59SJacob Faibussowitsch       suffix: host_no_device
860e6b6b59SJacob Faibussowitsch     test:
870e6b6b59SJacob Faibussowitsch       requires: device
880e6b6b59SJacob Faibussowitsch       args: -default_device_type host
890e6b6b59SJacob Faibussowitsch       suffix: host_with_device
90a4af0ceeSJacob Faibussowitsch     test:
91a4af0ceeSJacob Faibussowitsch       requires: cuda
920e6b6b59SJacob Faibussowitsch       args: -default_device_type cuda
93a4af0ceeSJacob Faibussowitsch       suffix: cuda
94a4af0ceeSJacob Faibussowitsch     test:
95a4af0ceeSJacob Faibussowitsch       requires: hip
960e6b6b59SJacob Faibussowitsch       args: -default_device_type hip
97a4af0ceeSJacob Faibussowitsch       suffix: hip
98a2158755SJunchao Zhang     test:
99a2158755SJunchao Zhang       requires: sycl
1000e6b6b59SJacob Faibussowitsch       args: -default_device_type sycl
101a2158755SJunchao Zhang       suffix: sycl
102a4af0ceeSJacob Faibussowitsch 
103667ab0feSJacob Faibussowitsch   testset:
104*27d4e10aSPierre Jolivet     requires: !defined(PETSC_DEVICE_LANGUAGE_CXX)
10561c8d4edSPierre Jolivet     output_file: output/ExitSuccess.out
106667ab0feSJacob Faibussowitsch     suffix: no_cxx
107667ab0feSJacob Faibussowitsch 
108a4af0ceeSJacob Faibussowitsch TEST*/
109