1f9fea11eSJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextSetDevice.\n\n"; 2f9fea11eSJacob Faibussowitsch 3f9fea11eSJacob Faibussowitsch #include "petscdevicetestcommon.h" 4f9fea11eSJacob Faibussowitsch 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) 49f9fea11eSJacob Faibussowitsch if (PetscDefined(HAVE_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: 62667ab0feSJacob Faibussowitsch requires: 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: 85667ab0feSJacob Faibussowitsch requires: !cxx 86*61c8d4edSPierre Jolivet output_file: output/ExitSuccess.out 87667ab0feSJacob Faibussowitsch suffix: no_cxx 88667ab0feSJacob Faibussowitsch 89f9fea11eSJacob Faibussowitsch TEST*/ 90