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; 9667ab0feSJacob Faibussowitsch PetscDevice devices[10]; 10a4af0ceeSJacob Faibussowitsch 11327415f7SBarry Smith PetscFunctionBeginUser; 129566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 13667ab0feSJacob Faibussowitsch // would have just done 14667ab0feSJacob Faibussowitsch // 15667ab0feSJacob Faibussowitsch // const PetscInt n = 10; 16667ab0feSJacob Faibussowitsch // PetscDevice devices[n]; 17667ab0feSJacob Faibussowitsch // 18667ab0feSJacob Faibussowitsch // but alas the reliably insane MSVC balks at this to the tune of 19667ab0feSJacob Faibussowitsch // 'ex1.c(9): error C2057: expected constant expression'. So instead we have a runtime check 20667ab0feSJacob Faibussowitsch PetscCheck(PETSC_STATIC_ARRAY_LENGTH(devices) == n, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Forgot to update n"); 21a4af0ceeSJacob Faibussowitsch 22a4af0ceeSJacob Faibussowitsch /* normal create and destroy */ 230e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 249566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 259566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 269566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 27a4af0ceeSJacob Faibussowitsch /* should not destroy twice */ 289566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 299566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 30a4af0ceeSJacob Faibussowitsch 31a4af0ceeSJacob Faibussowitsch /* test reference counting */ 32a4af0ceeSJacob Faibussowitsch device = NULL; 339566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(devices, n)); 340e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 359566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 36a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 379566063dSJacob Faibussowitsch PetscCall(PetscDeviceReference_Internal(device)); 38a4af0ceeSJacob Faibussowitsch devices[i] = device; 39a4af0ceeSJacob Faibussowitsch } 409566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 41a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 429566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&devices[i])); 439566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 449566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(devices[i])); 45a4af0ceeSJacob Faibussowitsch } 469566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 479566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 48a4af0ceeSJacob Faibussowitsch 49a4af0ceeSJacob Faibussowitsch /* test the default devices exist */ 50a4af0ceeSJacob Faibussowitsch device = NULL; 519566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(devices, n)); 52a4af0ceeSJacob Faibussowitsch { 53a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 54a4af0ceeSJacob Faibussowitsch /* global context will have the default device */ 559566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 569566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetDevice(dctx, &device)); 57a4af0ceeSJacob Faibussowitsch } 589566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 59a4af0ceeSJacob Faibussowitsch /* test reference counting for default device */ 60a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 619566063dSJacob Faibussowitsch PetscCall(PetscDeviceReference_Internal(device)); 62a4af0ceeSJacob Faibussowitsch devices[i] = device; 63a4af0ceeSJacob Faibussowitsch } 649566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 65a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 669566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&devices[i])); 679566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 689566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(devices[i])); 69a4af0ceeSJacob Faibussowitsch } 70a4af0ceeSJacob Faibussowitsch 719566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n")); 729566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 73b122ec5aSJacob Faibussowitsch return 0; 74a4af0ceeSJacob Faibussowitsch } 75a4af0ceeSJacob Faibussowitsch 76a4af0ceeSJacob Faibussowitsch /*TEST 77a4af0ceeSJacob Faibussowitsch 78a4af0ceeSJacob Faibussowitsch testset: 79667ab0feSJacob Faibussowitsch requires: cxx 80*61c8d4edSPierre Jolivet output_file: output/ExitSuccess.out 81a4af0ceeSJacob Faibussowitsch nsize: {{1 2 5}} 82f9fea11eSJacob Faibussowitsch args: -device_enable {{none lazy eager}} 830e6b6b59SJacob Faibussowitsch test: 840e6b6b59SJacob Faibussowitsch requires: !device 850e6b6b59SJacob Faibussowitsch suffix: host_no_device 860e6b6b59SJacob Faibussowitsch test: 870e6b6b59SJacob Faibussowitsch requires: device 880e6b6b59SJacob Faibussowitsch args: -default_device_type host 890e6b6b59SJacob Faibussowitsch suffix: host_with_device 90a4af0ceeSJacob Faibussowitsch test: 91a4af0ceeSJacob Faibussowitsch requires: cuda 920e6b6b59SJacob Faibussowitsch args: -default_device_type cuda 93a4af0ceeSJacob Faibussowitsch suffix: cuda 94a4af0ceeSJacob Faibussowitsch test: 95a4af0ceeSJacob Faibussowitsch requires: hip 960e6b6b59SJacob Faibussowitsch args: -default_device_type hip 97a4af0ceeSJacob Faibussowitsch suffix: hip 98a2158755SJunchao Zhang test: 99a2158755SJunchao Zhang requires: sycl 1000e6b6b59SJacob Faibussowitsch args: -default_device_type sycl 101a2158755SJunchao Zhang suffix: sycl 102a4af0ceeSJacob Faibussowitsch 103667ab0feSJacob Faibussowitsch testset: 104667ab0feSJacob Faibussowitsch requires: !cxx 105*61c8d4edSPierre Jolivet output_file: output/ExitSuccess.out 106667ab0feSJacob Faibussowitsch suffix: no_cxx 107667ab0feSJacob Faibussowitsch 108a4af0ceeSJacob Faibussowitsch TEST*/ 109