xref: /petsc/src/sys/objects/device/tests/ex10.c (revision 4738d3a542aa5c639ab67e3a6dbbe514dfbe774d)
1*4738d3a5SJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextSetStreamType().\n\n";
2*4738d3a5SJacob Faibussowitsch 
3*4738d3a5SJacob Faibussowitsch #include "petscdevicetestcommon.h"
4*4738d3a5SJacob Faibussowitsch 
5*4738d3a5SJacob Faibussowitsch int main(int argc, char *argv[])
6*4738d3a5SJacob Faibussowitsch {
7*4738d3a5SJacob Faibussowitsch   const PetscStreamType stypes[] = {
8*4738d3a5SJacob Faibussowitsch #if PetscDefined(HAVE_CXX)
9*4738d3a5SJacob Faibussowitsch     PETSC_STREAM_GLOBAL_BLOCKING,
10*4738d3a5SJacob Faibussowitsch     PETSC_STREAM_DEFAULT_BLOCKING,
11*4738d3a5SJacob Faibussowitsch     PETSC_STREAM_GLOBAL_NONBLOCKING
12*4738d3a5SJacob Faibussowitsch #else
13*4738d3a5SJacob Faibussowitsch     PETSC_STREAM_GLOBAL_BLOCKING,
14*4738d3a5SJacob Faibussowitsch #endif
15*4738d3a5SJacob Faibussowitsch   };
16*4738d3a5SJacob Faibussowitsch   const PetscInt ntypes = PETSC_STATIC_ARRAY_LENGTH(stypes);
17*4738d3a5SJacob Faibussowitsch 
18*4738d3a5SJacob Faibussowitsch   PetscFunctionBeginUser;
19*4738d3a5SJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
20*4738d3a5SJacob Faibussowitsch 
21*4738d3a5SJacob Faibussowitsch   // test that get-set trivially work
22*4738d3a5SJacob Faibussowitsch   for (PetscInt i = 0; i < ntypes; ++i) {
23*4738d3a5SJacob Faibussowitsch     PetscDeviceContext tmp;
24*4738d3a5SJacob Faibussowitsch     PetscStreamType    tmp_type;
25*4738d3a5SJacob Faibussowitsch 
26*4738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextCreate(&tmp));
27*4738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
28*4738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
29*4738d3a5SJacob Faibussowitsch     PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s"));
30*4738d3a5SJacob Faibussowitsch     // test that any combination of get-set trivially works
31*4738d3a5SJacob Faibussowitsch     for (PetscInt j = 0; j < ntypes; ++j) {
32*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[j]));
33*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
34*4738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[j], "Set PetscDeviceStreamType %s does not match expected %s"));
35*4738d3a5SJacob Faibussowitsch       // reset it back to original
36*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
37*4738d3a5SJacob Faibussowitsch     }
38*4738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextDestroy(&tmp));
39*4738d3a5SJacob Faibussowitsch   }
40*4738d3a5SJacob Faibussowitsch 
41*4738d3a5SJacob Faibussowitsch   // test that any combination of get-set works when set up
42*4738d3a5SJacob Faibussowitsch   for (PetscInt i = 0; i < ntypes; ++i) {
43*4738d3a5SJacob Faibussowitsch     for (PetscInt j = 0; j < ntypes; ++j) {
44*4738d3a5SJacob Faibussowitsch       PetscDeviceContext tmp;
45*4738d3a5SJacob Faibussowitsch       PetscStreamType    tmp_type;
46*4738d3a5SJacob Faibussowitsch 
47*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextCreate(&tmp));
48*4738d3a5SJacob Faibussowitsch       // check this works through setup
49*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
50*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetUp(tmp));
51*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
52*4738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s after PetscDeviceContextSetUp"));
53*4738d3a5SJacob Faibussowitsch       // now change the stream type
54*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[j]));
55*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
56*4738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[j], "Set PetscDeviceStreamType %s does not match expected %s when changing after PetscDeviceContextSetUp"));
57*4738d3a5SJacob Faibussowitsch       // reset it back to original
58*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
59*4738d3a5SJacob Faibussowitsch       // and ensure this works
60*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
61*4738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s after setting back to original"));
62*4738d3a5SJacob Faibussowitsch       // finally set up again
63*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetUp(tmp));
64*4738d3a5SJacob Faibussowitsch       // and ensure it has not changed
65*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
66*4738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s after setting back to original and PetscDeviceContextSetUp"));
67*4738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextDestroy(&tmp));
68*4738d3a5SJacob Faibussowitsch     }
69*4738d3a5SJacob Faibussowitsch   }
70*4738d3a5SJacob Faibussowitsch 
71*4738d3a5SJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
72*4738d3a5SJacob Faibussowitsch   PetscCall(PetscFinalize());
73*4738d3a5SJacob Faibussowitsch   return 0;
74*4738d3a5SJacob Faibussowitsch }
75*4738d3a5SJacob Faibussowitsch 
76*4738d3a5SJacob Faibussowitsch /*TEST
77*4738d3a5SJacob Faibussowitsch 
78*4738d3a5SJacob Faibussowitsch   testset:
79*4738d3a5SJacob Faibussowitsch     requires: cxx
80*4738d3a5SJacob Faibussowitsch     output_file: ./output/ExitSuccess.out
81*4738d3a5SJacob Faibussowitsch     args: -device_enable {{lazy eager}}
82*4738d3a5SJacob Faibussowitsch     test:
83*4738d3a5SJacob Faibussowitsch       requires: !device
84*4738d3a5SJacob Faibussowitsch       suffix: host_no_device
85*4738d3a5SJacob Faibussowitsch     test:
86*4738d3a5SJacob Faibussowitsch       requires: device
87*4738d3a5SJacob Faibussowitsch       args: -default_device_type host
88*4738d3a5SJacob Faibussowitsch       suffix: host_with_device
89*4738d3a5SJacob Faibussowitsch     test:
90*4738d3a5SJacob Faibussowitsch       requires: cuda
91*4738d3a5SJacob Faibussowitsch       args: -default_device_type cuda
92*4738d3a5SJacob Faibussowitsch       suffix: cuda
93*4738d3a5SJacob Faibussowitsch     test:
94*4738d3a5SJacob Faibussowitsch       requires: hip
95*4738d3a5SJacob Faibussowitsch       args: -default_device_type hip
96*4738d3a5SJacob Faibussowitsch       suffix: hip
97*4738d3a5SJacob Faibussowitsch     test:
98*4738d3a5SJacob Faibussowitsch       requires: sycl
99*4738d3a5SJacob Faibussowitsch       args: -default_device_type sycl
100*4738d3a5SJacob Faibussowitsch       suffix: sycl
101*4738d3a5SJacob Faibussowitsch 
102*4738d3a5SJacob Faibussowitsch   test:
103*4738d3a5SJacob Faibussowitsch     requires: !cxx
104*4738d3a5SJacob Faibussowitsch     output_file: ./output/ExitSuccess.out
105*4738d3a5SJacob Faibussowitsch     suffix: no_cxx
106*4738d3a5SJacob Faibussowitsch 
107*4738d3a5SJacob Faibussowitsch TEST*/
108