1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n"; 2a4af0ceeSJacob Faibussowitsch 3a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 4a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h" 5a4af0ceeSJacob Faibussowitsch 6a4af0ceeSJacob Faibussowitsch int main(int argc, char *argv[]) 7a4af0ceeSJacob Faibussowitsch { 8a4af0ceeSJacob Faibussowitsch const PetscInt n = 10; 9a4af0ceeSJacob Faibussowitsch PetscDevice device = NULL; 10a4af0ceeSJacob Faibussowitsch PetscDevice devices[n]; 11a4af0ceeSJacob Faibussowitsch 12*9566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,NULL,help)); 13a4af0ceeSJacob Faibussowitsch 14a4af0ceeSJacob Faibussowitsch /* normal create and destroy */ 15*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device)); 16*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 17*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 18*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 19a4af0ceeSJacob Faibussowitsch /* should not destroy twice */ 20*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 21*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 22a4af0ceeSJacob Faibussowitsch 23a4af0ceeSJacob Faibussowitsch /* test reference counting */ 24a4af0ceeSJacob Faibussowitsch device = NULL; 25*9566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(devices,n)); 26*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device)); 27*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 28a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 29*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceReference_Internal(device)); 30a4af0ceeSJacob Faibussowitsch devices[i] = device; 31a4af0ceeSJacob Faibussowitsch } 32*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 33a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 34*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&devices[i])); 35*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 36*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(devices[i])); 37a4af0ceeSJacob Faibussowitsch } 38*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&device)); 39*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(device)); 40a4af0ceeSJacob Faibussowitsch 41a4af0ceeSJacob Faibussowitsch /* test the default devices exist */ 42a4af0ceeSJacob Faibussowitsch device = NULL; 43*9566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(devices,n)); 44a4af0ceeSJacob Faibussowitsch { 45a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 46a4af0ceeSJacob Faibussowitsch /* global context will have the default device */ 47*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 48*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetDevice(dctx,&device)); 49a4af0ceeSJacob Faibussowitsch } 50*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 51a4af0ceeSJacob Faibussowitsch /* test reference counting for default device */ 52a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 53*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceReference_Internal(device)); 54a4af0ceeSJacob Faibussowitsch devices[i] = device; 55a4af0ceeSJacob Faibussowitsch } 56*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 57a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 58*9566063dSJacob Faibussowitsch PetscCall(PetscDeviceDestroy(&devices[i])); 59*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceExists(device)); 60*9566063dSJacob Faibussowitsch PetscCall(AssertDeviceDoesNotExist(devices[i])); 61a4af0ceeSJacob Faibussowitsch } 62a4af0ceeSJacob Faibussowitsch 63*9566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n")); 64*9566063dSJacob 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: 746ab378d1SJacob Faibussowitsch TODO: broken in ci 75a4af0ceeSJacob Faibussowitsch requires: !device 76a4af0ceeSJacob Faibussowitsch suffix: no_device 77a4af0ceeSJacob Faibussowitsch filter: Error: grep -E -o -e ".*No support for this operation for this object type" -e ".*PETSc is not configured with device support.*" -e "^\[0\]PETSC ERROR:.*[0-9]{1} [A-z]+\(\)" 78a4af0ceeSJacob Faibussowitsch test: 79a4af0ceeSJacob Faibussowitsch requires: debug 80a4af0ceeSJacob Faibussowitsch suffix: debug 81a4af0ceeSJacob Faibussowitsch test: 82a4af0ceeSJacob Faibussowitsch requires: !debug 83a4af0ceeSJacob Faibussowitsch suffix: opt 84a4af0ceeSJacob Faibussowitsch 85a4af0ceeSJacob Faibussowitsch testset: 86a4af0ceeSJacob Faibussowitsch output_file: ./output/ExitSuccess.out 87a4af0ceeSJacob Faibussowitsch nsize: {{1 2 5}} 88a4af0ceeSJacob Faibussowitsch test: 89a4af0ceeSJacob Faibussowitsch requires: cuda 90a4af0ceeSJacob Faibussowitsch suffix: cuda 91a4af0ceeSJacob Faibussowitsch test: 92a4af0ceeSJacob Faibussowitsch requires: hip 93a4af0ceeSJacob Faibussowitsch suffix: hip 94a2158755SJunchao Zhang test: 95a2158755SJunchao Zhang requires: sycl 96a2158755SJunchao Zhang suffix: sycl 97a4af0ceeSJacob Faibussowitsch 98a4af0ceeSJacob Faibussowitsch TEST*/ 99