1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextDuplicate.\n\n"; 2a4af0ceeSJacob Faibussowitsch 3a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 4a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h" 5a4af0ceeSJacob Faibussowitsch 6a4af0ceeSJacob Faibussowitsch /* test duplication creates the same object type */ 7a4af0ceeSJacob Faibussowitsch static PetscErrorCode TestPetscDeviceContextDuplicate(PetscDeviceContext dctx) 8a4af0ceeSJacob Faibussowitsch { 9a4af0ceeSJacob Faibussowitsch PetscDevice origDevice; 10a4af0ceeSJacob Faibussowitsch PetscStreamType origStype; 11a4af0ceeSJacob Faibussowitsch PetscDeviceContext ddup; 12a4af0ceeSJacob Faibussowitsch 13a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 14a4af0ceeSJacob Faibussowitsch PetscValidDeviceContext(dctx,1); 15a4af0ceeSJacob Faibussowitsch /* get everything we want first before any duplication */ 165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetStreamType(dctx,&origStype)); 175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetDevice(dctx,&origDevice)); 18a4af0ceeSJacob Faibussowitsch 19a4af0ceeSJacob Faibussowitsch /* duplicate */ 205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextDuplicate(dctx,&ddup)); 21a4af0ceeSJacob Faibussowitsch PetscValidDeviceContext(ddup,2); 22a4af0ceeSJacob Faibussowitsch PetscCheckCompatibleDeviceContexts(dctx,1,ddup,2); 23a4af0ceeSJacob Faibussowitsch 24a4af0ceeSJacob Faibussowitsch { 25a4af0ceeSJacob Faibussowitsch PetscDevice parDevice,dupDevice; 26a4af0ceeSJacob Faibussowitsch 275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetDevice(dctx,&parDevice)); 285f80ce2aSJacob Faibussowitsch CHKERRQ(AssertPetscDevicesValidAndEqual(parDevice,origDevice,"Parent PetscDevice after duplication does not match parent original PetscDevice")); 295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetDevice(ddup,&dupDevice)); 305f80ce2aSJacob Faibussowitsch CHKERRQ(AssertPetscDevicesValidAndEqual(dupDevice,origDevice,"Duplicated PetscDevice does not match parent original PetscDevice")); 31a4af0ceeSJacob Faibussowitsch } 32a4af0ceeSJacob Faibussowitsch 33a4af0ceeSJacob Faibussowitsch { 34a4af0ceeSJacob Faibussowitsch PetscStreamType parStype,dupStype; 35a4af0ceeSJacob Faibussowitsch 365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetStreamType(dctx,&parStype)); 375f80ce2aSJacob Faibussowitsch CHKERRQ(AssertPetscStreamTypesValidAndEqual(parStype,origStype,"Parent PetscStreamType after duplication does not match parent original PetscStreamType")); 385f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetStreamType(ddup,&dupStype)); 395f80ce2aSJacob Faibussowitsch CHKERRQ(AssertPetscStreamTypesValidAndEqual(dupStype,origStype,"Duplicated PetscStreamType '%s' does not match parent original PetscStreamType '%s'")); 40a4af0ceeSJacob Faibussowitsch } 41a4af0ceeSJacob Faibussowitsch 425f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextDestroy(&ddup)); 43a4af0ceeSJacob Faibussowitsch /* duplicate should not take the original down with it */ 44a4af0ceeSJacob Faibussowitsch PetscValidDeviceContext(dctx,1); 45a4af0ceeSJacob Faibussowitsch PetscFunctionReturn(0); 46a4af0ceeSJacob Faibussowitsch } 47a4af0ceeSJacob Faibussowitsch 48a4af0ceeSJacob Faibussowitsch int main(int argc, char *argv[]) 49a4af0ceeSJacob Faibussowitsch { 50a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 51a4af0ceeSJacob Faibussowitsch 52*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,NULL,help)); 53a4af0ceeSJacob Faibussowitsch 54a4af0ceeSJacob Faibussowitsch /* basic creation and destruction */ 555f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextCreate(&dctx)); 565f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextSetFromOptions(PETSC_COMM_WORLD,"local_",dctx)); 575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextSetUp(dctx)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(TestPetscDeviceContextDuplicate(dctx)); 595f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextDestroy(&dctx)); 60a4af0ceeSJacob Faibussowitsch 615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDeviceContextGetCurrentContext(&dctx)); 625f80ce2aSJacob Faibussowitsch CHKERRQ(TestPetscDeviceContextDuplicate(dctx)); 63a4af0ceeSJacob Faibussowitsch 645f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n")); 65*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 66*b122ec5aSJacob Faibussowitsch return 0; 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 80a4af0ceeSJacob Faibussowitsch testset: 81a4af0ceeSJacob Faibussowitsch output_file: ./output/ExitSuccess.out 82adbde6ceSSatish Balay nsize: {{1 4}} 83a4af0ceeSJacob Faibussowitsch args: -local_device_context_stream_type {{global_blocking default_blocking global_nonblocking}} 84a4af0ceeSJacob Faibussowitsch test: 85a4af0ceeSJacob Faibussowitsch requires: cuda 86a4af0ceeSJacob Faibussowitsch suffix: cuda 87a4af0ceeSJacob Faibussowitsch test: 88a4af0ceeSJacob Faibussowitsch requires: hip 89a4af0ceeSJacob Faibussowitsch suffix: hip 90a4af0ceeSJacob Faibussowitsch 91a4af0ceeSJacob Faibussowitsch TEST*/ 92