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