xref: /petsc/src/sys/objects/device/tests/ex4.c (revision e600fa544e2bb197ca2af9b6e65ea465976dec56)
1 static const char help[] = "Tests PetscDeviceContextFork/Join.\n\n";
2 
3 #include <petsc/private/deviceimpl.h>
4 #include "petscdevicetestcommon.h"
5 
6 static PetscErrorCode TestNestedPetscDeviceContextForkJoin(PetscDeviceContext parCtx, PetscDeviceContext *sub)
7 {
8   const PetscInt      nsub = 4;
9   PetscDeviceContext *subsub;
10   PetscErrorCode      ierr;
11 
12   PetscFunctionBegin;
13   PetscValidDeviceContext(parCtx,1);
14   PetscValidPointer(sub,2);
15   ierr = AssertPetscDeviceContextsValidAndEqual(parCtx,sub[0],"Current global context does not match expected global context");CHKERRQ(ierr);
16   /* create some children from an active child */
17   ierr = PetscDeviceContextFork(sub[1],nsub,&subsub);CHKERRQ(ierr);
18   /* join on a sibling to the parent */
19   ierr = PetscDeviceContextJoin(sub[2],nsub-2,PETSC_DEVICE_CONTEXT_JOIN_SYNC,&subsub);CHKERRQ(ierr);
20   /* join on the grandparent */
21   ierr = PetscDeviceContextJoin(parCtx,nsub-2,PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC,&subsub);CHKERRQ(ierr);
22   ierr = PetscDeviceContextJoin(sub[1],nsub,PETSC_DEVICE_CONTEXT_JOIN_DESTROY,&subsub);CHKERRQ(ierr);
23   PetscFunctionReturn(0);
24 }
25 
26 /* test fork-join */
27 static PetscErrorCode TestPetscDeviceContextForkJoin(PetscDeviceContext dctx)
28 {
29   PetscDeviceContext *sub;
30   const PetscInt      n = 10;
31   PetscErrorCode      ierr;
32 
33   PetscFunctionBegin;
34   PetscValidDeviceContext(dctx,1);
35   /* mostly for valgrind to catch errors */
36   ierr = PetscDeviceContextFork(dctx,n,&sub);CHKERRQ(ierr);
37   ierr = PetscDeviceContextJoin(dctx,n,PETSC_DEVICE_CONTEXT_JOIN_DESTROY,&sub);CHKERRQ(ierr);
38   /* do it twice */
39   ierr = PetscDeviceContextFork(dctx,n,&sub);CHKERRQ(ierr);
40   ierr = PetscDeviceContextJoin(dctx,n,PETSC_DEVICE_CONTEXT_JOIN_DESTROY,&sub);CHKERRQ(ierr);
41 
42   /* create some children */
43   ierr = PetscDeviceContextFork(dctx,n+1,&sub);CHKERRQ(ierr);
44   /* test forking within nested function */
45   ierr = TestNestedPetscDeviceContextForkJoin(sub[0],sub);CHKERRQ(ierr);
46   /* join a subset */
47   ierr = PetscDeviceContextJoin(dctx,n-1,PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC,&sub);CHKERRQ(ierr);
48   /* back to the ether from whence they came */
49   ierr = PetscDeviceContextJoin(dctx,n+1,PETSC_DEVICE_CONTEXT_JOIN_DESTROY,&sub);CHKERRQ(ierr);
50   PetscFunctionReturn(0);
51 }
52 
53 int main(int argc, char *argv[])
54 {
55   PetscDeviceContext dctx;
56   PetscErrorCode     ierr;
57 
58   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
59 
60   ierr = PetscDeviceContextCreate(&dctx);CHKERRQ(ierr);
61   ierr = PetscDeviceContextSetFromOptions(PETSC_COMM_WORLD,"local_",dctx);CHKERRQ(ierr);
62   ierr = PetscDeviceContextSetUp(dctx);CHKERRQ(ierr);
63   ierr = TestPetscDeviceContextForkJoin(dctx);CHKERRQ(ierr);
64   ierr = PetscDeviceContextDestroy(&dctx);CHKERRQ(ierr);
65 
66   ierr = PetscDeviceContextGetCurrentContext(&dctx);CHKERRQ(ierr);
67   ierr = TestPetscDeviceContextForkJoin(dctx);CHKERRQ(ierr);
68 
69   ierr = PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n");CHKERRQ(ierr);
70   ierr = PetscFinalize();
71   return ierr;
72 }
73 
74 /*TEST
75 
76  build:
77    requires: defined(PETSC_HAVE_CXX)
78 
79  test:
80    requires: !device
81    suffix: no_device
82    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]+\(\)"
83 
84  testset:
85    output_file: ./output/ExitSuccess.out
86    nsize: {{1 3}}
87    args: -local_device_context_stream_type {{global_blocking default_blocking global_nonblocking}}
88    test:
89      requires: cuda
90      suffix: cuda
91    test:
92      requires: hip
93      suffix: hip
94 
95 TEST*/
96