xref: /petsc/src/sys/objects/device/tests/ex8.c (revision 017deb10d530c1b6d9744fcd772cd96c5fcd74f2)
1f9fea11eSJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextSetDevice.\n\n";
2f9fea11eSJacob Faibussowitsch 
3f9fea11eSJacob Faibussowitsch #include "petscdevicetestcommon.h"
4f9fea11eSJacob Faibussowitsch 
main(int argc,char * argv[])5f9fea11eSJacob Faibussowitsch int main(int argc, char *argv[])
6f9fea11eSJacob Faibussowitsch {
7f9fea11eSJacob Faibussowitsch   PetscDeviceContext dctx   = NULL;
8f9fea11eSJacob Faibussowitsch   PetscDevice        device = NULL, other_device = NULL;
9f9fea11eSJacob Faibussowitsch 
10f9fea11eSJacob Faibussowitsch   PetscFunctionBeginUser;
11f9fea11eSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
12f9fea11eSJacob Faibussowitsch 
13f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&dctx));
14f9fea11eSJacob Faibussowitsch   PetscCall(AssertDeviceContextExists(dctx));
15f9fea11eSJacob Faibussowitsch 
16f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device));
17f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceConfigure(device));
18f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceView(device, NULL));
19f9fea11eSJacob Faibussowitsch 
20f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetDevice(dctx, device));
21f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetDevice(dctx, &other_device));
22f9fea11eSJacob Faibussowitsch   PetscCall(AssertPetscDevicesValidAndEqual(device, other_device, "PetscDevice after setdevice() does not match original PetscDevice"));
23f9fea11eSJacob Faibussowitsch   // output here should be a duplicate of output above
24f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceView(other_device, NULL));
25f9fea11eSJacob Faibussowitsch 
26f9fea11eSJacob Faibussowitsch   // setup, test that this doesn't clobber the device
27f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetUp(dctx));
28f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetDevice(dctx, &other_device));
29f9fea11eSJacob Faibussowitsch   PetscCall(AssertPetscDevicesValidAndEqual(device, other_device, "PetscDevice after setdevice() does not match original PetscDevice"));
30f9fea11eSJacob Faibussowitsch   // once again output of this view should not change anything
31f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceView(other_device, NULL));
32f9fea11eSJacob Faibussowitsch 
33f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextView(dctx, NULL));
34f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&dctx));
35f9fea11eSJacob Faibussowitsch 
36f9fea11eSJacob Faibussowitsch   // while we have destroyed the device context (which should decrement the PetscDevice's
37f9fea11eSJacob Faibussowitsch   // refcount), we still hold a reference ourselves. Check that it remains valid
38f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceView(device, NULL));
39f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&dctx));
40f9fea11eSJacob Faibussowitsch   // PetscDeviceContext secretly keeps the device reference alive until the device context
41f9fea11eSJacob Faibussowitsch   // itself is recycled. So create a new context here such that PetscDeviceDestroy() is called
42f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceView(device, NULL));
43f9fea11eSJacob Faibussowitsch 
44f9fea11eSJacob Faibussowitsch   // setup will attach the default device
45f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetUp(dctx));
46f9fea11eSJacob Faibussowitsch   // check that it has, the attached device should not be equal to ours
47f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetDevice(dctx, &other_device));
48f9fea11eSJacob Faibussowitsch   // None C++ builds have dummy devices (NULL)
49*27d4e10aSPierre Jolivet   if (PetscDefined(DEVICELANGUAGE_CXX)) PetscCheck(device != other_device, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDeviceContext still has old PetscDevice attached after being recycled!");
50f9fea11eSJacob Faibussowitsch 
51f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&dctx));
52f9fea11eSJacob Faibussowitsch   PetscCall(PetscDeviceDestroy(&device));
53f9fea11eSJacob Faibussowitsch 
54f9fea11eSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
55f9fea11eSJacob Faibussowitsch   PetscCall(PetscFinalize());
56f9fea11eSJacob Faibussowitsch   return 0;
57f9fea11eSJacob Faibussowitsch }
58f9fea11eSJacob Faibussowitsch 
59f9fea11eSJacob Faibussowitsch /*TEST
60f9fea11eSJacob Faibussowitsch 
61f9fea11eSJacob Faibussowitsch   testset:
62*27d4e10aSPierre Jolivet     requires: defined(PETSC_DEVICELANGUAGE_CXX)
63f9fea11eSJacob Faibussowitsch     args: -device_enable {{lazy eager}}
64f9fea11eSJacob Faibussowitsch     test:
65f9fea11eSJacob Faibussowitsch       requires: !device
66f9fea11eSJacob Faibussowitsch       suffix: host_no_device
67f9fea11eSJacob Faibussowitsch     test:
68f9fea11eSJacob Faibussowitsch       requires: device
69f9fea11eSJacob Faibussowitsch       args: -default_device_type host
70f9fea11eSJacob Faibussowitsch       suffix: host_with_device
71f9fea11eSJacob Faibussowitsch     test:
72f9fea11eSJacob Faibussowitsch       requires: cuda
73f9fea11eSJacob Faibussowitsch       args: -default_device_type cuda
74f9fea11eSJacob Faibussowitsch       suffix: cuda
75f9fea11eSJacob Faibussowitsch     test:
76f9fea11eSJacob Faibussowitsch       requires: hip
77f9fea11eSJacob Faibussowitsch       args: -default_device_type hip
78f9fea11eSJacob Faibussowitsch       suffix: hip
79f9fea11eSJacob Faibussowitsch     test:
80f9fea11eSJacob Faibussowitsch       requires: sycl
81f9fea11eSJacob Faibussowitsch       args: -default_device_type sycl
82f9fea11eSJacob Faibussowitsch       suffix: sycl
83f9fea11eSJacob Faibussowitsch 
84667ab0feSJacob Faibussowitsch   testset:
85*27d4e10aSPierre Jolivet     requires: !defined(PETSC_DEVICELANGUAGE_CXX)
8661c8d4edSPierre Jolivet     output_file: output/ExitSuccess.out
87667ab0feSJacob Faibussowitsch     suffix: no_cxx
88667ab0feSJacob Faibussowitsch 
89f9fea11eSJacob Faibussowitsch TEST*/
90