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