1 static const char help[] = "Tests PetscDeviceContextDuplicate.\n\n"; 2 3 #include <petsc/private/deviceimpl.h> 4 #include "petscdevicetestcommon.h" 5 6 /* test duplication creates the same object type */ 7 static PetscErrorCode TestPetscDeviceContextDuplicate(PetscDeviceContext dctx) 8 { 9 PetscDevice origDevice; 10 PetscStreamType origStype; 11 PetscDeviceContext ddup; 12 PetscErrorCode ierr; 13 14 PetscFunctionBegin; 15 PetscValidDeviceContext(dctx,1); 16 /* get everything we want first before any duplication */ 17 ierr = PetscDeviceContextGetStreamType(dctx,&origStype);CHKERRQ(ierr); 18 ierr = PetscDeviceContextGetDevice(dctx,&origDevice);CHKERRQ(ierr); 19 20 /* duplicate */ 21 ierr = PetscDeviceContextDuplicate(dctx,&ddup);CHKERRQ(ierr); 22 PetscValidDeviceContext(ddup,2); 23 PetscCheckCompatibleDeviceContexts(dctx,1,ddup,2); 24 25 { 26 PetscDevice parDevice,dupDevice; 27 28 ierr = PetscDeviceContextGetDevice(dctx,&parDevice);CHKERRQ(ierr); 29 ierr = AssertPetscDevicesValidAndEqual(parDevice,origDevice,"Parent PetscDevice after duplication does not match parent original PetscDevice");CHKERRQ(ierr); 30 ierr = PetscDeviceContextGetDevice(ddup,&dupDevice);CHKERRQ(ierr); 31 ierr = AssertPetscDevicesValidAndEqual(dupDevice,origDevice,"Duplicated PetscDevice does not match parent original PetscDevice");CHKERRQ(ierr); 32 } 33 34 { 35 PetscStreamType parStype,dupStype; 36 37 ierr = PetscDeviceContextGetStreamType(dctx,&parStype);CHKERRQ(ierr); 38 ierr = AssertPetscStreamTypesValidAndEqual(parStype,origStype,"Parent PetscStreamType after duplication does not match parent original PetscStreamType");CHKERRQ(ierr); 39 ierr = PetscDeviceContextGetStreamType(ddup,&dupStype);CHKERRQ(ierr); 40 ierr = AssertPetscStreamTypesValidAndEqual(dupStype,origStype,"Duplicated PetscStreamType '%s' does not match parent original PetscStreamType '%s'");CHKERRQ(ierr); 41 } 42 43 ierr = PetscDeviceContextDestroy(&ddup);CHKERRQ(ierr); 44 /* duplicate should not take the original down with it */ 45 PetscValidDeviceContext(dctx,1); 46 PetscFunctionReturn(0); 47 } 48 49 int main(int argc, char *argv[]) 50 { 51 PetscDeviceContext dctx; 52 PetscErrorCode ierr; 53 54 ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 55 56 /* basic creation and destruction */ 57 ierr = PetscDeviceContextCreate(&dctx);CHKERRQ(ierr); 58 ierr = PetscDeviceContextSetFromOptions(PETSC_COMM_WORLD,"local_",dctx);CHKERRQ(ierr); 59 ierr = PetscDeviceContextSetUp(dctx);CHKERRQ(ierr); 60 ierr = TestPetscDeviceContextDuplicate(dctx);CHKERRQ(ierr); 61 ierr = PetscDeviceContextDestroy(&dctx);CHKERRQ(ierr); 62 63 ierr = PetscDeviceContextGetCurrentContext(&dctx);CHKERRQ(ierr); 64 ierr = TestPetscDeviceContextDuplicate(dctx);CHKERRQ(ierr); 65 66 ierr = PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n");CHKERRQ(ierr); 67 ierr = PetscFinalize(); 68 return ierr; 69 } 70 71 /*TEST 72 73 build: 74 requires: defined(PETSC_HAVE_CXX_DIALECT_CXX11) 75 76 testset: 77 requires: !device 78 suffix: no_device 79 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]+\(\)" 80 81 testset: 82 output_file: ./output/ExitSuccess.out 83 nsize: {{1 4 10}} 84 args: -local_device_context_stream_type {{global_blocking default_blocking global_nonblocking}} 85 test: 86 requires: cuda 87 suffix: cuda 88 test: 89 requires: hip 90 suffix: hip 91 92 TEST*/ 93