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