1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n"; 2a4af0ceeSJacob Faibussowitsch 3a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h" 4a4af0ceeSJacob Faibussowitsch 5d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[]) 6d71ae5a4SJacob Faibussowitsch { 7a4af0ceeSJacob Faibussowitsch const PetscInt n = 10; 8a4af0ceeSJacob Faibussowitsch PetscDevice device = NULL; 9a4af0ceeSJacob Faibussowitsch PetscDevice devices[n]; 10a4af0ceeSJacob Faibussowitsch 11327415f7SBarry Smith PetscFunctionBeginUser; 129566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 13a4af0ceeSJacob Faibussowitsch 14a4af0ceeSJacob Faibussowitsch /* normal create and destroy */ 150e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 169566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 179566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 189566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 19a4af0ceeSJacob Faibussowitsch /* should not destroy twice */ 209566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 219566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 22a4af0ceeSJacob Faibussowitsch 23a4af0ceeSJacob Faibussowitsch /* test reference counting */ 24a4af0ceeSJacob Faibussowitsch device = NULL; 259566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(devices, n)); 260e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 279566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 28a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 299566063dSJacob Faibussowitsch PetscCall(PetscDeviceReference_Internal(device)); 30a4af0ceeSJacob Faibussowitsch devices[i] = device; 31a4af0ceeSJacob Faibussowitsch } 329566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 33a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 349566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&devices[i])); 359566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 369566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(devices[i])); 37a4af0ceeSJacob Faibussowitsch } 389566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 399566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 40a4af0ceeSJacob Faibussowitsch 41a4af0ceeSJacob Faibussowitsch /* test the default devices exist */ 42a4af0ceeSJacob Faibussowitsch device = NULL; 439566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(devices, n)); 44a4af0ceeSJacob Faibussowitsch { 45a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 46a4af0ceeSJacob Faibussowitsch /* global context will have the default device */ 479566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 489566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetDevice(dctx, &device)); 49a4af0ceeSJacob Faibussowitsch } 509566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 51a4af0ceeSJacob Faibussowitsch /* test reference counting for default device */ 52a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 539566063dSJacob Faibussowitsch PetscCall(PetscDeviceReference_Internal(device)); 54a4af0ceeSJacob Faibussowitsch devices[i] = device; 55a4af0ceeSJacob Faibussowitsch } 569566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 57a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 589566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&devices[i])); 599566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 609566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(devices[i])); 61a4af0ceeSJacob Faibussowitsch } 62a4af0ceeSJacob Faibussowitsch 639566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n")); 649566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 65b122ec5aSJacob Faibussowitsch return 0; 66a4af0ceeSJacob Faibussowitsch } 67a4af0ceeSJacob Faibussowitsch 68a4af0ceeSJacob Faibussowitsch /*TEST 69a4af0ceeSJacob Faibussowitsch 70a4af0ceeSJacob Faibussowitsch build: 71cb9b7bb0SJacob Faibussowitsch requires: defined(PETSC_HAVE_CXX) 72a4af0ceeSJacob Faibussowitsch 73a4af0ceeSJacob Faibussowitsch testset: 74a4af0ceeSJacob Faibussowitsch output_file: ./output/ExitSuccess.out 75a4af0ceeSJacob Faibussowitsch nsize: {{1 2 5}} 76*f9fea11eSJacob Faibussowitsch args: -device_enable {{none lazy eager}} 770e6b6b59SJacob Faibussowitsch test: 780e6b6b59SJacob Faibussowitsch requires: !device 790e6b6b59SJacob Faibussowitsch suffix: host_no_device 800e6b6b59SJacob Faibussowitsch test: 810e6b6b59SJacob Faibussowitsch requires: device 820e6b6b59SJacob Faibussowitsch args: -default_device_type host 830e6b6b59SJacob Faibussowitsch suffix: host_with_device 84a4af0ceeSJacob Faibussowitsch test: 85a4af0ceeSJacob Faibussowitsch requires: cuda 860e6b6b59SJacob Faibussowitsch args: -default_device_type cuda 87a4af0ceeSJacob Faibussowitsch suffix: cuda 88a4af0ceeSJacob Faibussowitsch test: 89a4af0ceeSJacob Faibussowitsch requires: hip 900e6b6b59SJacob Faibussowitsch args: -default_device_type hip 91a4af0ceeSJacob Faibussowitsch suffix: hip 92a2158755SJunchao Zhang test: 93a2158755SJunchao Zhang requires: sycl 940e6b6b59SJacob Faibussowitsch args: -default_device_type sycl 95a2158755SJunchao Zhang suffix: sycl 96a4af0ceeSJacob Faibussowitsch 97a4af0ceeSJacob Faibussowitsch TEST*/ 98