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