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