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 */
TestPetscDeviceContextDuplicate(PetscDeviceContext dctx)6d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestPetscDeviceContextDuplicate(PetscDeviceContext dctx)
7d71ae5a4SJacob Faibussowitsch {
8a4af0ceeSJacob Faibussowitsch PetscDevice origDevice;
9a4af0ceeSJacob Faibussowitsch PetscStreamType origStype;
10a4af0ceeSJacob Faibussowitsch PetscDeviceContext ddup;
11a4af0ceeSJacob Faibussowitsch
12a4af0ceeSJacob Faibussowitsch PetscFunctionBegin;
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);
20f9fea11eSJacob Faibussowitsch if (dctx) 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 */
42f9fea11eSJacob Faibussowitsch if (dctx) PetscValidDeviceContext(dctx, 1);
433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
44a4af0ceeSJacob Faibussowitsch }
45a4af0ceeSJacob Faibussowitsch
main(int argc,char * argv[])46d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[])
47d71ae5a4SJacob Faibussowitsch {
480e6b6b59SJacob Faibussowitsch MPI_Comm comm;
49a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx;
50a4af0ceeSJacob Faibussowitsch
51327415f7SBarry Smith PetscFunctionBeginUser;
529566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help));
530e6b6b59SJacob Faibussowitsch comm = PETSC_COMM_WORLD;
54a4af0ceeSJacob Faibussowitsch
55a4af0ceeSJacob Faibussowitsch /* basic creation and destruction */
569566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextCreate(&dctx));
570e6b6b59SJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dctx, "local_"));
580e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceContextSetFromOptions(comm, dctx));
599566063dSJacob Faibussowitsch PetscCall(TestPetscDeviceContextDuplicate(dctx));
609566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextDestroy(&dctx));
61a4af0ceeSJacob Faibussowitsch
629566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
639566063dSJacob Faibussowitsch PetscCall(TestPetscDeviceContextDuplicate(dctx));
64a4af0ceeSJacob Faibussowitsch
65f9fea11eSJacob Faibussowitsch PetscCall(TestPetscDeviceContextDuplicate(NULL));
66f9fea11eSJacob Faibussowitsch
670e6b6b59SJacob Faibussowitsch PetscCall(PetscPrintf(comm, "EXIT_SUCCESS\n"));
689566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
69b122ec5aSJacob Faibussowitsch return 0;
70a4af0ceeSJacob Faibussowitsch }
71a4af0ceeSJacob Faibussowitsch
72a4af0ceeSJacob Faibussowitsch /*TEST
73a4af0ceeSJacob Faibussowitsch
74a4af0ceeSJacob Faibussowitsch testset:
75*27d4e10aSPierre Jolivet requires: defined(PETSC_DEVICELANGUAGE_CXX)
7661c8d4edSPierre Jolivet output_file: output/ExitSuccess.out
77adbde6ceSSatish Balay nsize: {{1 4}}
780e6b6b59SJacob Faibussowitsch args: -device_enable {{lazy eager}}
79d9acb416SHong Zhang args: -local_device_context_stream_type {{default nonblocking default_with_barrier nonblocking_with_barrier}}
80a4af0ceeSJacob Faibussowitsch test:
810e6b6b59SJacob Faibussowitsch requires: !device
820e6b6b59SJacob Faibussowitsch suffix: host_no_device
830e6b6b59SJacob Faibussowitsch test:
840e6b6b59SJacob Faibussowitsch requires: device
850e6b6b59SJacob Faibussowitsch args: -default_device_type host -root_device_context_device_type host
860e6b6b59SJacob Faibussowitsch suffix: host_with_device
870e6b6b59SJacob Faibussowitsch test:
88a4af0ceeSJacob Faibussowitsch requires: cuda
890e6b6b59SJacob Faibussowitsch args: -default_device_type cuda -root_device_context_device_type cuda
90a4af0ceeSJacob Faibussowitsch suffix: cuda
91a4af0ceeSJacob Faibussowitsch test:
92a4af0ceeSJacob Faibussowitsch requires: hip
930e6b6b59SJacob Faibussowitsch args: -default_device_type hip -root_device_context_device_type hip
94a4af0ceeSJacob Faibussowitsch suffix: hip
95667ab0feSJacob Faibussowitsch test:
96667ab0feSJacob Faibussowitsch requires: sycl
97667ab0feSJacob Faibussowitsch args: -default_device_type sycl -root_device_context_device_type sycl
98667ab0feSJacob Faibussowitsch suffix: sycl
99667ab0feSJacob Faibussowitsch
100a4af0ceeSJacob Faibussowitsch TEST*/
101