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*/