xref: /petsc/src/sys/objects/device/tests/ex4.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextFork/Join.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h>
4a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
5a4af0ceeSJacob Faibussowitsch 
6*9371c9d4SSatish Balay static PetscErrorCode TestNestedPetscDeviceContextForkJoin(PetscDeviceContext parCtx, PetscDeviceContext *sub) {
7a4af0ceeSJacob Faibussowitsch   const PetscInt      nsub = 4;
8a4af0ceeSJacob Faibussowitsch   PetscDeviceContext *subsub;
9a4af0ceeSJacob Faibussowitsch 
10a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
11a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(parCtx, 1);
12a4af0ceeSJacob Faibussowitsch   PetscValidPointer(sub, 2);
139566063dSJacob Faibussowitsch   PetscCall(AssertPetscDeviceContextsValidAndEqual(parCtx, sub[0], "Current global context does not match expected global context"));
14a4af0ceeSJacob Faibussowitsch   /* create some children from an active child */
159566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextFork(sub[1], nsub, &subsub));
16a4af0ceeSJacob Faibussowitsch   /* join on a sibling to the parent */
179566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(sub[2], nsub - 2, PETSC_DEVICE_CONTEXT_JOIN_SYNC, &subsub));
18a4af0ceeSJacob Faibussowitsch   /* join on the grandparent */
199566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(parCtx, nsub - 2, PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC, &subsub));
209566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(sub[1], nsub, PETSC_DEVICE_CONTEXT_JOIN_DESTROY, &subsub));
21a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
22a4af0ceeSJacob Faibussowitsch }
23a4af0ceeSJacob Faibussowitsch 
24a4af0ceeSJacob Faibussowitsch /* test fork-join */
25*9371c9d4SSatish Balay static PetscErrorCode TestPetscDeviceContextForkJoin(PetscDeviceContext dctx) {
26a4af0ceeSJacob Faibussowitsch   PetscDeviceContext *sub;
27a4af0ceeSJacob Faibussowitsch   const PetscInt      n = 10;
28a4af0ceeSJacob Faibussowitsch 
29a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
30a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx, 1);
31a4af0ceeSJacob Faibussowitsch   /* mostly for valgrind to catch errors */
329566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextFork(dctx, n, &sub));
339566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(dctx, n, PETSC_DEVICE_CONTEXT_JOIN_DESTROY, &sub));
34a4af0ceeSJacob Faibussowitsch   /* do it twice */
359566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextFork(dctx, n, &sub));
369566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(dctx, n, PETSC_DEVICE_CONTEXT_JOIN_DESTROY, &sub));
37a4af0ceeSJacob Faibussowitsch 
38a4af0ceeSJacob Faibussowitsch   /* create some children */
399566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextFork(dctx, n + 1, &sub));
40a4af0ceeSJacob Faibussowitsch   /* test forking within nested function */
419566063dSJacob Faibussowitsch   PetscCall(TestNestedPetscDeviceContextForkJoin(sub[0], sub));
42a4af0ceeSJacob Faibussowitsch   /* join a subset */
439566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(dctx, n - 1, PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC, &sub));
44a4af0ceeSJacob Faibussowitsch   /* back to the ether from whence they came */
459566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextJoin(dctx, n + 1, PETSC_DEVICE_CONTEXT_JOIN_DESTROY, &sub));
46a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
47a4af0ceeSJacob Faibussowitsch }
48a4af0ceeSJacob Faibussowitsch 
49*9371c9d4SSatish Balay int main(int argc, char *argv[]) {
50a4af0ceeSJacob Faibussowitsch   PetscDeviceContext dctx;
51a4af0ceeSJacob Faibussowitsch 
52327415f7SBarry Smith   PetscFunctionBeginUser;
539566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
54a4af0ceeSJacob Faibussowitsch 
559566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&dctx));
569566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetFromOptions(PETSC_COMM_WORLD, "local_", dctx));
579566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextSetUp(dctx));
589566063dSJacob Faibussowitsch   PetscCall(TestPetscDeviceContextForkJoin(dctx));
599566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&dctx));
60a4af0ceeSJacob Faibussowitsch 
619566063dSJacob Faibussowitsch   PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
629566063dSJacob Faibussowitsch   PetscCall(TestPetscDeviceContextForkJoin(dctx));
63a4af0ceeSJacob Faibussowitsch 
649566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "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  test:
756ab378d1SJacob Faibussowitsch    TODO: broken in ci
76a4af0ceeSJacob Faibussowitsch    requires: !device
77a4af0ceeSJacob Faibussowitsch    suffix: no_device
78a4af0ceeSJacob 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]+\(\)"
79a4af0ceeSJacob Faibussowitsch 
80a4af0ceeSJacob Faibussowitsch  testset:
81a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
82a4af0ceeSJacob Faibussowitsch    nsize: {{1 3}}
83a4af0ceeSJacob Faibussowitsch    args: -local_device_context_stream_type {{global_blocking default_blocking global_nonblocking}}
84a4af0ceeSJacob Faibussowitsch    test:
85a4af0ceeSJacob Faibussowitsch      requires: cuda
86a4af0ceeSJacob Faibussowitsch      suffix: cuda
87a4af0ceeSJacob Faibussowitsch    test:
88a4af0ceeSJacob Faibussowitsch      requires: hip
89a4af0ceeSJacob Faibussowitsch      suffix: hip
90a4af0ceeSJacob Faibussowitsch 
91a4af0ceeSJacob Faibussowitsch TEST*/
92