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