xref: /petsc/src/sys/objects/device/tests/ex9.c (revision d9acb416d05abeed0a33bde3a81aeb2ea0364f6a)
1dfcd79e9SJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextQueryIdle.\n\n";
2dfcd79e9SJacob Faibussowitsch 
3dfcd79e9SJacob Faibussowitsch #include "petscdevicetestcommon.h"
4dfcd79e9SJacob Faibussowitsch 
5dfcd79e9SJacob Faibussowitsch static PetscErrorCode CheckIdle(PetscDeviceContext dctx, const char operation[])
6dfcd79e9SJacob Faibussowitsch {
7dfcd79e9SJacob Faibussowitsch   PetscBool idle = PETSC_FALSE;
8dfcd79e9SJacob Faibussowitsch 
9dfcd79e9SJacob Faibussowitsch   PetscFunctionBegin;
10dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextQueryIdle(dctx, &idle));
11dfcd79e9SJacob Faibussowitsch   if (!idle) {
12dfcd79e9SJacob Faibussowitsch     PetscCall(PetscDeviceContextView(dctx, NULL));
13dfcd79e9SJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDeviceContext was not idle after %s!", operation);
14dfcd79e9SJacob Faibussowitsch   }
153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
16dfcd79e9SJacob Faibussowitsch }
17dfcd79e9SJacob Faibussowitsch 
18dfcd79e9SJacob Faibussowitsch static PetscErrorCode TestQueryIdle(PetscDeviceContext dctx)
19dfcd79e9SJacob Faibussowitsch {
20dfcd79e9SJacob Faibussowitsch   PetscDeviceContext other = NULL;
21dfcd79e9SJacob Faibussowitsch 
22dfcd79e9SJacob Faibussowitsch   PetscFunctionBegin;
23dfcd79e9SJacob Faibussowitsch   // Should of course be idle after synchronization
24dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextSynchronize(dctx));
25dfcd79e9SJacob Faibussowitsch   PetscCall(CheckIdle(dctx, "synchronization"));
26dfcd79e9SJacob Faibussowitsch 
27dfcd79e9SJacob Faibussowitsch   // Creating an unrelated device context should leave it idle
28dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&other));
29dfcd79e9SJacob Faibussowitsch   PetscCall(CheckIdle(dctx, "creating unrelated dctx"));
30dfcd79e9SJacob Faibussowitsch 
31dfcd79e9SJacob Faibussowitsch   // Destroying an unrelated device context shouldn't change things either
32dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&other));
33dfcd79e9SJacob Faibussowitsch   PetscCall(CheckIdle(dctx, "destroying unrelated dctx"));
34dfcd79e9SJacob Faibussowitsch 
35dfcd79e9SJacob Faibussowitsch   // Duplicating shouldn't change it either
36dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextDuplicate(dctx, &other));
37dfcd79e9SJacob Faibussowitsch   PetscCall(CheckIdle(dctx, "duplication"));
38dfcd79e9SJacob Faibussowitsch 
39dfcd79e9SJacob Faibussowitsch   // Another ctx waiting on it (which may make the other ctx non-idle) should not make the
40dfcd79e9SJacob Faibussowitsch   // current one non-idle...
41dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextWaitForContext(other, dctx));
42dfcd79e9SJacob Faibussowitsch   // ...unless it is the null ctx, in which case it being "idle" is equivalent to asking
43dfcd79e9SJacob Faibussowitsch   // whether the whole device (which includes other streams) is idle. Since the other ctx might
44dfcd79e9SJacob Faibussowitsch   // be busy, we should explicitly synchronize on the null ctx
45dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextSynchronize(NULL /* equivalently dctx if dctx = NULL */));
46dfcd79e9SJacob Faibussowitsch   PetscCall(CheckIdle(dctx, "other context waited on it, and synchronizing the NULL context"));
47dfcd79e9SJacob Faibussowitsch   // both contexts should be idle
48dfcd79e9SJacob Faibussowitsch   PetscCall(CheckIdle(other, "waiting on other context, and synchronizing the NULL context"));
49dfcd79e9SJacob Faibussowitsch 
50dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&other));
513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
52dfcd79e9SJacob Faibussowitsch }
53dfcd79e9SJacob Faibussowitsch 
54dfcd79e9SJacob Faibussowitsch int main(int argc, char *argv[])
55dfcd79e9SJacob Faibussowitsch {
56dfcd79e9SJacob Faibussowitsch   PetscDeviceContext dctx = NULL;
57dfcd79e9SJacob Faibussowitsch 
58dfcd79e9SJacob Faibussowitsch   PetscFunctionBeginUser;
59dfcd79e9SJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
60dfcd79e9SJacob Faibussowitsch 
61dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextCreate(&dctx));
62*d9acb416SHong Zhang   PetscCall(PetscDeviceContextSetStreamType(dctx, PETSC_STREAM_NONBLOCKING));
63dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextSetUp(dctx));
64dfcd79e9SJacob Faibussowitsch   PetscCall(TestQueryIdle(dctx));
65dfcd79e9SJacob Faibussowitsch   PetscCall(PetscDeviceContextDestroy(&dctx));
66dfcd79e9SJacob Faibussowitsch 
67dfcd79e9SJacob Faibussowitsch   PetscCall(TestQueryIdle(NULL));
68dfcd79e9SJacob Faibussowitsch 
69dfcd79e9SJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
70dfcd79e9SJacob Faibussowitsch   PetscCall(PetscFinalize());
71dfcd79e9SJacob Faibussowitsch   return 0;
72dfcd79e9SJacob Faibussowitsch }
73dfcd79e9SJacob Faibussowitsch 
74dfcd79e9SJacob Faibussowitsch /*TEST
75dfcd79e9SJacob Faibussowitsch 
76dfcd79e9SJacob Faibussowitsch   testset:
77667ab0feSJacob Faibussowitsch     requires: cxx
78dfcd79e9SJacob Faibussowitsch     output_file: ./output/ExitSuccess.out
79dfcd79e9SJacob Faibussowitsch     args: -device_enable {{lazy eager}}
80dfcd79e9SJacob Faibussowitsch     test:
81dfcd79e9SJacob Faibussowitsch       requires: !device
82dfcd79e9SJacob Faibussowitsch       suffix: host_no_device
83dfcd79e9SJacob Faibussowitsch     test:
84dfcd79e9SJacob Faibussowitsch       requires: device
85dfcd79e9SJacob Faibussowitsch       args: -default_device_type host
86dfcd79e9SJacob Faibussowitsch       suffix: host_with_device
87dfcd79e9SJacob Faibussowitsch     test:
88dfcd79e9SJacob Faibussowitsch       requires: cuda
89dfcd79e9SJacob Faibussowitsch       args: -default_device_type cuda
90dfcd79e9SJacob Faibussowitsch       suffix: cuda
91dfcd79e9SJacob Faibussowitsch     test:
92dfcd79e9SJacob Faibussowitsch       requires: hip
93dfcd79e9SJacob Faibussowitsch       args: -default_device_type hip
94dfcd79e9SJacob Faibussowitsch       suffix: hip
95dfcd79e9SJacob Faibussowitsch     test:
96dfcd79e9SJacob Faibussowitsch       requires: sycl
97dfcd79e9SJacob Faibussowitsch       args: -default_device_type sycl
98dfcd79e9SJacob Faibussowitsch       suffix: sycl
99dfcd79e9SJacob Faibussowitsch 
100667ab0feSJacob Faibussowitsch   test:
101667ab0feSJacob Faibussowitsch     requires: !cxx
102667ab0feSJacob Faibussowitsch     output_file: ./output/ExitSuccess.out
103667ab0feSJacob Faibussowitsch     suffix: no_cxx
104667ab0feSJacob Faibussowitsch 
105dfcd79e9SJacob Faibussowitsch TEST*/
106