1dfcd79e9SJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextQueryIdle.\n\n";
2dfcd79e9SJacob Faibussowitsch
3dfcd79e9SJacob Faibussowitsch #include "petscdevicetestcommon.h"
4dfcd79e9SJacob Faibussowitsch
CheckIdle(PetscDeviceContext dctx,const char operation[])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
TestQueryIdle(PetscDeviceContext dctx)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
main(int argc,char * argv[])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));
62d9acb416SHong 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:
77*27d4e10aSPierre Jolivet requires: defined(PETSC_DEVICELANGUAGE_CXX)
7861c8d4edSPierre Jolivet 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:
101*27d4e10aSPierre Jolivet requires: !defined(PETSC_DEVICELANGUAGE_CXX)
10261c8d4edSPierre Jolivet output_file: output/ExitSuccess.out
103667ab0feSJacob Faibussowitsch suffix: no_cxx
104667ab0feSJacob Faibussowitsch
105dfcd79e9SJacob Faibussowitsch TEST*/
106