xref: /petsc/src/sys/objects/device/tests/ex3.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254) !
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