xref: /petsc/src/sys/objects/device/tests/ex3.c (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextDuplicate.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
4a4af0ceeSJacob Faibussowitsch 
5a4af0ceeSJacob Faibussowitsch /* test duplication creates the same object type */
69371c9d4SSatish Balay static PetscErrorCode TestPetscDeviceContextDuplicate(PetscDeviceContext dctx) {
7a4af0ceeSJacob Faibussowitsch   PetscDevice        origDevice;
8a4af0ceeSJacob Faibussowitsch   PetscStreamType    origStype;
9a4af0ceeSJacob Faibussowitsch   PetscDeviceContext ddup;
10a4af0ceeSJacob Faibussowitsch 
11a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
12a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx, 1);
13a4af0ceeSJacob Faibussowitsch   /* get everything we want first before any duplication */
149566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetStreamType(dctx, &origStype));
159566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetDevice(dctx, &origDevice));
16a4af0ceeSJacob Faibussowitsch 
17a4af0ceeSJacob Faibussowitsch   /* duplicate */
189566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDuplicate(dctx, &ddup));
19a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(ddup, 2);
20a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDeviceContexts(dctx, 1, ddup, 2);
21a4af0ceeSJacob Faibussowitsch 
22a4af0ceeSJacob Faibussowitsch   {
23a4af0ceeSJacob Faibussowitsch     PetscDevice parDevice, dupDevice;
24a4af0ceeSJacob Faibussowitsch 
259566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(dctx, &parDevice));
269566063dSJacob Faibussowitsch     PetscCall(AssertPetscDevicesValidAndEqual(parDevice, origDevice, "Parent PetscDevice after duplication does not match parent original PetscDevice"));
279566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(ddup, &dupDevice));
289566063dSJacob Faibussowitsch     PetscCall(AssertPetscDevicesValidAndEqual(dupDevice, origDevice, "Duplicated PetscDevice does not match parent original PetscDevice"));
29a4af0ceeSJacob Faibussowitsch   }
30a4af0ceeSJacob Faibussowitsch 
31a4af0ceeSJacob Faibussowitsch   {
32a4af0ceeSJacob Faibussowitsch     PetscStreamType parStype, dupStype;
33a4af0ceeSJacob Faibussowitsch 
349566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetStreamType(dctx, &parStype));
359566063dSJacob Faibussowitsch     PetscCall(AssertPetscStreamTypesValidAndEqual(parStype, origStype, "Parent PetscStreamType after duplication does not match parent original PetscStreamType"));
369566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetStreamType(ddup, &dupStype));
379566063dSJacob Faibussowitsch     PetscCall(AssertPetscStreamTypesValidAndEqual(dupStype, origStype, "Duplicated PetscStreamType '%s' does not match parent original PetscStreamType '%s'"));
38a4af0ceeSJacob Faibussowitsch   }
39a4af0ceeSJacob Faibussowitsch 
409566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&ddup));
41a4af0ceeSJacob Faibussowitsch   /* duplicate should not take the original down with it */
42a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx, 1);
43a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
44a4af0ceeSJacob Faibussowitsch }
45a4af0ceeSJacob Faibussowitsch 
469371c9d4SSatish Balay int main(int argc, char *argv[]) {
47*0e6b6b59SJacob Faibussowitsch   MPI_Comm           comm;
48a4af0ceeSJacob Faibussowitsch   PetscDeviceContext dctx;
49a4af0ceeSJacob Faibussowitsch 
50327415f7SBarry Smith   PetscFunctionBeginUser;
519566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
52*0e6b6b59SJacob Faibussowitsch   comm = PETSC_COMM_WORLD;
53a4af0ceeSJacob Faibussowitsch 
54a4af0ceeSJacob Faibussowitsch   /* basic creation and destruction */
559566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&dctx));
56*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dctx, "local_"));
57*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceContextSetFromOptions(comm, dctx));
589566063dSJacob Faibussowitsch   PetscCall(TestPetscDeviceContextDuplicate(dctx));
599566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&dctx));
60a4af0ceeSJacob Faibussowitsch 
619566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
629566063dSJacob Faibussowitsch   PetscCall(TestPetscDeviceContextDuplicate(dctx));
63a4af0ceeSJacob Faibussowitsch 
64*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscPrintf(comm, "EXIT_SUCCESS\n"));
659566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
66b122ec5aSJacob 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:
75a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
76adbde6ceSSatish Balay    nsize: {{1 4}}
77*0e6b6b59SJacob Faibussowitsch    args: -device_enable {{lazy eager}}
78a4af0ceeSJacob Faibussowitsch    args: -local_device_context_stream_type {{global_blocking default_blocking global_nonblocking}}
79a4af0ceeSJacob Faibussowitsch    test:
80*0e6b6b59SJacob Faibussowitsch      requires: !device
81*0e6b6b59SJacob Faibussowitsch      suffix: host_no_device
82*0e6b6b59SJacob Faibussowitsch    test:
83*0e6b6b59SJacob Faibussowitsch      requires: device
84*0e6b6b59SJacob Faibussowitsch      args: -default_device_type host -root_device_context_device_type host
85*0e6b6b59SJacob Faibussowitsch      suffix: host_with_device
86*0e6b6b59SJacob Faibussowitsch    test:
87a4af0ceeSJacob Faibussowitsch      requires: cuda
88*0e6b6b59SJacob Faibussowitsch      args: -default_device_type cuda -root_device_context_device_type cuda
89a4af0ceeSJacob Faibussowitsch      suffix: cuda
90a4af0ceeSJacob Faibussowitsch    test:
91a4af0ceeSJacob Faibussowitsch      requires: hip
92*0e6b6b59SJacob Faibussowitsch      args: -default_device_type hip -root_device_context_device_type hip
93a4af0ceeSJacob Faibussowitsch      suffix: hip
94a4af0ceeSJacob Faibussowitsch 
95a4af0ceeSJacob Faibussowitsch TEST*/
96