1 static const char help[] = "Tests creation and destruction of PetscDevice.\n\n"; 2 3 #include "petscdevicetestcommon.h" 4 5 int main(int argc, char *argv[]) 6 { 7 const PetscInt n = 10; 8 PetscDevice device = NULL; 9 PetscDevice devices[10]; 10 11 PetscFunctionBeginUser; 12 PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 13 // would have just done 14 // 15 // const PetscInt n = 10; 16 // PetscDevice devices[n]; 17 // 18 // but alas the reliably insane MSVC balks at this to the tune of 19 // 'ex1.c(9): error C2057: expected constant expression'. So instead we have a runtime check 20 PetscCheck(PETSC_STATIC_ARRAY_LENGTH(devices) == n, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Forgot to update n"); 21 22 /* normal create and destroy */ 23 PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 24 PetscCall(AssertDeviceExists(device)); 25 PetscCall(PetscDeviceDestroy(&device)); 26 PetscCall(AssertDeviceDoesNotExist(device)); 27 /* should not destroy twice */ 28 PetscCall(PetscDeviceDestroy(&device)); 29 PetscCall(AssertDeviceDoesNotExist(device)); 30 31 /* test reference counting */ 32 device = NULL; 33 PetscCall(PetscArrayzero(devices, n)); 34 PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT(), PETSC_DECIDE, &device)); 35 PetscCall(AssertDeviceExists(device)); 36 for (int i = 0; i < n; ++i) { 37 PetscCall(PetscDeviceReference_Internal(device)); 38 devices[i] = device; 39 } 40 PetscCall(AssertDeviceExists(device)); 41 for (int i = 0; i < n; ++i) { 42 PetscCall(PetscDeviceDestroy(&devices[i])); 43 PetscCall(AssertDeviceExists(device)); 44 PetscCall(AssertDeviceDoesNotExist(devices[i])); 45 } 46 PetscCall(PetscDeviceDestroy(&device)); 47 PetscCall(AssertDeviceDoesNotExist(device)); 48 49 /* test the default devices exist */ 50 device = NULL; 51 PetscCall(PetscArrayzero(devices, n)); 52 { 53 PetscDeviceContext dctx; 54 /* global context will have the default device */ 55 PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 56 PetscCall(PetscDeviceContextGetDevice(dctx, &device)); 57 } 58 PetscCall(AssertDeviceExists(device)); 59 /* test reference counting for default device */ 60 for (int i = 0; i < n; ++i) { 61 PetscCall(PetscDeviceReference_Internal(device)); 62 devices[i] = device; 63 } 64 PetscCall(AssertDeviceExists(device)); 65 for (int i = 0; i < n; ++i) { 66 PetscCall(PetscDeviceDestroy(&devices[i])); 67 PetscCall(AssertDeviceExists(device)); 68 PetscCall(AssertDeviceDoesNotExist(devices[i])); 69 } 70 71 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n")); 72 PetscCall(PetscFinalize()); 73 return 0; 74 } 75 76 /*TEST 77 78 testset: 79 requires: cxx 80 output_file: ./output/ExitSuccess.out 81 nsize: {{1 2 5}} 82 args: -device_enable {{none lazy eager}} 83 test: 84 requires: !device 85 suffix: host_no_device 86 test: 87 requires: device 88 args: -default_device_type host 89 suffix: host_with_device 90 test: 91 requires: cuda 92 args: -default_device_type cuda 93 suffix: cuda 94 test: 95 requires: hip 96 args: -default_device_type hip 97 suffix: hip 98 test: 99 requires: sycl 100 args: -default_device_type sycl 101 suffix: sycl 102 103 testset: 104 requires: !cxx 105 output_file: ./output/ExitSuccess.out 106 suffix: no_cxx 107 108 TEST*/ 109