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 PetscErrorCode ierr; 12a4af0ceeSJacob Faibussowitsch 13a4af0ceeSJacob Faibussowitsch ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 14a4af0ceeSJacob Faibussowitsch 15a4af0ceeSJacob Faibussowitsch /* normal create and destroy */ 16*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device)); 17*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 18*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceDestroy(&device)); 19*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceDoesNotExist(device)); 20a4af0ceeSJacob Faibussowitsch /* should not destroy twice */ 21*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceDestroy(&device)); 22*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceDoesNotExist(device)); 23a4af0ceeSJacob Faibussowitsch 24a4af0ceeSJacob Faibussowitsch /* test reference counting */ 25a4af0ceeSJacob Faibussowitsch device = NULL; 26*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArrayzero(devices,n)); 27*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device)); 28*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 29a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 30*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceReference_Internal(device)); 31a4af0ceeSJacob Faibussowitsch devices[i] = device; 32a4af0ceeSJacob Faibussowitsch } 33*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 34a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 35*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceDestroy(&devices[i])); 36*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 37*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceDoesNotExist(devices[i])); 38a4af0ceeSJacob Faibussowitsch } 39*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceDestroy(&device)); 40*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceDoesNotExist(device)); 41a4af0ceeSJacob Faibussowitsch 42a4af0ceeSJacob Faibussowitsch /* test the default devices exist */ 43a4af0ceeSJacob Faibussowitsch device = NULL; 44*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArrayzero(devices,n)); 45a4af0ceeSJacob Faibussowitsch { 46a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 47a4af0ceeSJacob Faibussowitsch /* global context will have the default device */ 48*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetCurrentContext(&dctx)); 49*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetDevice(dctx,&device)); 50a4af0ceeSJacob Faibussowitsch } 51*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 52a4af0ceeSJacob Faibussowitsch /* test reference counting for default device */ 53a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 54*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceReference_Internal(device)); 55a4af0ceeSJacob Faibussowitsch devices[i] = device; 56a4af0ceeSJacob Faibussowitsch } 57*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 58a4af0ceeSJacob Faibussowitsch for (int i = 0; i < n; ++i) { 59*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceDestroy(&devices[i])); 60*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceExists(device)); 61*5f80ce2aSJacob Faibussowitsch CHKERRQ(AssertDeviceDoesNotExist(devices[i])); 62a4af0ceeSJacob Faibussowitsch } 63a4af0ceeSJacob Faibussowitsch 64*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n")); 65a4af0ceeSJacob Faibussowitsch ierr = PetscFinalize(); 66a4af0ceeSJacob Faibussowitsch return ierr; 67a4af0ceeSJacob Faibussowitsch } 68a4af0ceeSJacob Faibussowitsch 69a4af0ceeSJacob Faibussowitsch /*TEST 70a4af0ceeSJacob Faibussowitsch 71a4af0ceeSJacob Faibussowitsch build: 72cb9b7bb0SJacob Faibussowitsch requires: defined(PETSC_HAVE_CXX) 73a4af0ceeSJacob Faibussowitsch 74a4af0ceeSJacob Faibussowitsch testset: 756ab378d1SJacob Faibussowitsch TODO: broken in ci 76a4af0ceeSJacob Faibussowitsch requires: !device 77a4af0ceeSJacob Faibussowitsch suffix: no_device 78a4af0ceeSJacob 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]+\(\)" 79a4af0ceeSJacob Faibussowitsch test: 80a4af0ceeSJacob Faibussowitsch requires: debug 81a4af0ceeSJacob Faibussowitsch suffix: debug 82a4af0ceeSJacob Faibussowitsch test: 83a4af0ceeSJacob Faibussowitsch requires: !debug 84a4af0ceeSJacob Faibussowitsch suffix: opt 85a4af0ceeSJacob Faibussowitsch 86a4af0ceeSJacob Faibussowitsch testset: 87a4af0ceeSJacob Faibussowitsch output_file: ./output/ExitSuccess.out 88a4af0ceeSJacob Faibussowitsch nsize: {{1 2 5}} 89a4af0ceeSJacob Faibussowitsch test: 90a4af0ceeSJacob Faibussowitsch requires: cuda 91a4af0ceeSJacob Faibussowitsch suffix: cuda 92a4af0ceeSJacob Faibussowitsch test: 93a4af0ceeSJacob Faibussowitsch requires: hip 94a4af0ceeSJacob Faibussowitsch suffix: hip 95a2158755SJunchao Zhang test: 96a2158755SJunchao Zhang requires: sycl 97a2158755SJunchao Zhang suffix: sycl 98a4af0ceeSJacob Faibussowitsch 99a4af0ceeSJacob Faibussowitsch TEST*/ 100