xref: /petsc/src/sys/objects/device/tests/ex3.c (revision 40badf4fbc550ac1f60bd080eaff6de6d55b946d)
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 
13   PetscFunctionBegin;
14   PetscValidDeviceContext(dctx,1);
15   /* get everything we want first before any duplication */
16   CHKERRQ(PetscDeviceContextGetStreamType(dctx,&origStype));
17   CHKERRQ(PetscDeviceContextGetDevice(dctx,&origDevice));
18 
19   /* duplicate */
20   CHKERRQ(PetscDeviceContextDuplicate(dctx,&ddup));
21   PetscValidDeviceContext(ddup,2);
22   PetscCheckCompatibleDeviceContexts(dctx,1,ddup,2);
23 
24   {
25     PetscDevice parDevice,dupDevice;
26 
27     CHKERRQ(PetscDeviceContextGetDevice(dctx,&parDevice));
28     CHKERRQ(AssertPetscDevicesValidAndEqual(parDevice,origDevice,"Parent PetscDevice after duplication does not match parent original PetscDevice"));
29     CHKERRQ(PetscDeviceContextGetDevice(ddup,&dupDevice));
30     CHKERRQ(AssertPetscDevicesValidAndEqual(dupDevice,origDevice,"Duplicated PetscDevice does not match parent original PetscDevice"));
31   }
32 
33   {
34     PetscStreamType parStype,dupStype;
35 
36     CHKERRQ(PetscDeviceContextGetStreamType(dctx,&parStype));
37     CHKERRQ(AssertPetscStreamTypesValidAndEqual(parStype,origStype,"Parent PetscStreamType after duplication does not match parent original PetscStreamType"));
38     CHKERRQ(PetscDeviceContextGetStreamType(ddup,&dupStype));
39     CHKERRQ(AssertPetscStreamTypesValidAndEqual(dupStype,origStype,"Duplicated PetscStreamType '%s' does not match parent original PetscStreamType '%s'"));
40   }
41 
42   CHKERRQ(PetscDeviceContextDestroy(&ddup));
43   /* duplicate should not take the original down with it */
44   PetscValidDeviceContext(dctx,1);
45   PetscFunctionReturn(0);
46 }
47 
48 int main(int argc, char *argv[])
49 {
50   PetscDeviceContext dctx;
51   PetscErrorCode     ierr;
52 
53   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
54 
55   /* basic creation and destruction */
56   CHKERRQ(PetscDeviceContextCreate(&dctx));
57   CHKERRQ(PetscDeviceContextSetFromOptions(PETSC_COMM_WORLD,"local_",dctx));
58   CHKERRQ(PetscDeviceContextSetUp(dctx));
59   CHKERRQ(TestPetscDeviceContextDuplicate(dctx));
60   CHKERRQ(PetscDeviceContextDestroy(&dctx));
61 
62   CHKERRQ(PetscDeviceContextGetCurrentContext(&dctx));
63   CHKERRQ(TestPetscDeviceContextDuplicate(dctx));
64 
65   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n"));
66   ierr = PetscFinalize();
67   return ierr;
68 }
69 
70 /*TEST
71 
72  build:
73    requires: defined(PETSC_HAVE_CXX)
74 
75  testset:
76    TODO: broken in ci
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}}
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