xref: /petsc/src/sys/objects/device/tests/ex3.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextDuplicate.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h>
4a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
5a4af0ceeSJacob Faibussowitsch 
6a4af0ceeSJacob Faibussowitsch /* test duplication creates the same object type */
7*9371c9d4SSatish Balay static PetscErrorCode TestPetscDeviceContextDuplicate(PetscDeviceContext dctx) {
8a4af0ceeSJacob Faibussowitsch   PetscDevice        origDevice;
9a4af0ceeSJacob Faibussowitsch   PetscStreamType    origStype;
10a4af0ceeSJacob Faibussowitsch   PetscDeviceContext ddup;
11a4af0ceeSJacob Faibussowitsch 
12a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
13a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx, 1);
14a4af0ceeSJacob Faibussowitsch   /* get everything we want first before any duplication */
159566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetStreamType(dctx, &origStype));
169566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetDevice(dctx, &origDevice));
17a4af0ceeSJacob Faibussowitsch 
18a4af0ceeSJacob Faibussowitsch   /* duplicate */
199566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDuplicate(dctx, &ddup));
20a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(ddup, 2);
21a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDeviceContexts(dctx, 1, ddup, 2);
22a4af0ceeSJacob Faibussowitsch 
23a4af0ceeSJacob Faibussowitsch   {
24a4af0ceeSJacob Faibussowitsch     PetscDevice parDevice, dupDevice;
25a4af0ceeSJacob Faibussowitsch 
269566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(dctx, &parDevice));
279566063dSJacob Faibussowitsch     PetscCall(AssertPetscDevicesValidAndEqual(parDevice, origDevice, "Parent PetscDevice after duplication does not match parent original PetscDevice"));
289566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetDevice(ddup, &dupDevice));
299566063dSJacob Faibussowitsch     PetscCall(AssertPetscDevicesValidAndEqual(dupDevice, origDevice, "Duplicated PetscDevice does not match parent original PetscDevice"));
30a4af0ceeSJacob Faibussowitsch   }
31a4af0ceeSJacob Faibussowitsch 
32a4af0ceeSJacob Faibussowitsch   {
33a4af0ceeSJacob Faibussowitsch     PetscStreamType parStype, dupStype;
34a4af0ceeSJacob Faibussowitsch 
359566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetStreamType(dctx, &parStype));
369566063dSJacob Faibussowitsch     PetscCall(AssertPetscStreamTypesValidAndEqual(parStype, origStype, "Parent PetscStreamType after duplication does not match parent original PetscStreamType"));
379566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetStreamType(ddup, &dupStype));
389566063dSJacob Faibussowitsch     PetscCall(AssertPetscStreamTypesValidAndEqual(dupStype, origStype, "Duplicated PetscStreamType '%s' does not match parent original PetscStreamType '%s'"));
39a4af0ceeSJacob Faibussowitsch   }
40a4af0ceeSJacob Faibussowitsch 
419566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&ddup));
42a4af0ceeSJacob Faibussowitsch   /* duplicate should not take the original down with it */
43a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx, 1);
44a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
45a4af0ceeSJacob Faibussowitsch }
46a4af0ceeSJacob Faibussowitsch 
47*9371c9d4SSatish Balay int main(int argc, char *argv[]) {
48a4af0ceeSJacob Faibussowitsch   PetscDeviceContext dctx;
49a4af0ceeSJacob Faibussowitsch 
50327415f7SBarry Smith   PetscFunctionBeginUser;
519566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
52a4af0ceeSJacob Faibussowitsch 
53a4af0ceeSJacob Faibussowitsch   /* basic creation and destruction */
549566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&dctx));
559566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetFromOptions(PETSC_COMM_WORLD, "local_", dctx));
569566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetUp(dctx));
579566063dSJacob Faibussowitsch   PetscCall(TestPetscDeviceContextDuplicate(dctx));
589566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&dctx));
59a4af0ceeSJacob Faibussowitsch 
609566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
619566063dSJacob Faibussowitsch   PetscCall(TestPetscDeviceContextDuplicate(dctx));
62a4af0ceeSJacob Faibussowitsch 
639566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
649566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
65b122ec5aSJacob Faibussowitsch   return 0;
66a4af0ceeSJacob Faibussowitsch }
67a4af0ceeSJacob Faibussowitsch 
68a4af0ceeSJacob Faibussowitsch /*TEST
69a4af0ceeSJacob Faibussowitsch 
70a4af0ceeSJacob Faibussowitsch  build:
71cb9b7bb0SJacob Faibussowitsch    requires: defined(PETSC_HAVE_CXX)
72a4af0ceeSJacob Faibussowitsch 
73a4af0ceeSJacob Faibussowitsch  testset:
746ab378d1SJacob Faibussowitsch    TODO: broken in ci
75a4af0ceeSJacob Faibussowitsch    requires: !device
76a4af0ceeSJacob Faibussowitsch    suffix: no_device
77a4af0ceeSJacob 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]+\(\)"
78a4af0ceeSJacob Faibussowitsch 
79a4af0ceeSJacob Faibussowitsch  testset:
80a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
81adbde6ceSSatish Balay    nsize: {{1 4}}
82a4af0ceeSJacob Faibussowitsch    args: -local_device_context_stream_type {{global_blocking default_blocking global_nonblocking}}
83a4af0ceeSJacob Faibussowitsch    test:
84a4af0ceeSJacob Faibussowitsch      requires: cuda
85a4af0ceeSJacob Faibussowitsch      suffix: cuda
86a4af0ceeSJacob Faibussowitsch    test:
87a4af0ceeSJacob Faibussowitsch      requires: hip
88a4af0ceeSJacob Faibussowitsch      suffix: hip
89a4af0ceeSJacob Faibussowitsch 
90a4af0ceeSJacob Faibussowitsch TEST*/
91