xref: /petsc/src/sys/objects/device/tests/ex10.c (revision 017deb10d530c1b6d9744fcd772cd96c5fcd74f2)
14738d3a5SJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextSetStreamType().\n\n";
24738d3a5SJacob Faibussowitsch 
34738d3a5SJacob Faibussowitsch #include "petscdevicetestcommon.h"
44738d3a5SJacob Faibussowitsch 
main(int argc,char * argv[])54738d3a5SJacob Faibussowitsch int main(int argc, char *argv[])
64738d3a5SJacob Faibussowitsch {
74738d3a5SJacob Faibussowitsch   const PetscStreamType stypes[] = {
8*27d4e10aSPierre Jolivet #if PetscDefined(DEVICELANGUAGE_CXX)
9fbccb6d4SPierre Jolivet     PETSC_STREAM_DEFAULT, PETSC_STREAM_NONBLOCKING, PETSC_STREAM_DEFAULT_WITH_BARRIER, PETSC_STREAM_NONBLOCKING_WITH_BARRIER
104738d3a5SJacob Faibussowitsch #else
11fbccb6d4SPierre Jolivet     PETSC_STREAM_DEFAULT
124738d3a5SJacob Faibussowitsch #endif
134738d3a5SJacob Faibussowitsch   };
144738d3a5SJacob Faibussowitsch   const PetscInt ntypes = PETSC_STATIC_ARRAY_LENGTH(stypes);
154738d3a5SJacob Faibussowitsch 
164738d3a5SJacob Faibussowitsch   PetscFunctionBeginUser;
174738d3a5SJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
184738d3a5SJacob Faibussowitsch 
194738d3a5SJacob Faibussowitsch   // test that get-set trivially work
204738d3a5SJacob Faibussowitsch   for (PetscInt i = 0; i < ntypes; ++i) {
214738d3a5SJacob Faibussowitsch     PetscDeviceContext tmp;
224738d3a5SJacob Faibussowitsch     PetscStreamType    tmp_type;
234738d3a5SJacob Faibussowitsch 
244738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextCreate(&tmp));
254738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
264738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
274738d3a5SJacob Faibussowitsch     PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s"));
284738d3a5SJacob Faibussowitsch     // test that any combination of get-set trivially works
294738d3a5SJacob Faibussowitsch     for (PetscInt j = 0; j < ntypes; ++j) {
304738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[j]));
314738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
324738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[j], "Set PetscDeviceStreamType %s does not match expected %s"));
334738d3a5SJacob Faibussowitsch       // reset it back to original
344738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
354738d3a5SJacob Faibussowitsch     }
364738d3a5SJacob Faibussowitsch     PetscCall(PetscDeviceContextDestroy(&tmp));
374738d3a5SJacob Faibussowitsch   }
384738d3a5SJacob Faibussowitsch 
394738d3a5SJacob Faibussowitsch   // test that any combination of get-set works when set up
404738d3a5SJacob Faibussowitsch   for (PetscInt i = 0; i < ntypes; ++i) {
414738d3a5SJacob Faibussowitsch     for (PetscInt j = 0; j < ntypes; ++j) {
424738d3a5SJacob Faibussowitsch       PetscDeviceContext tmp;
434738d3a5SJacob Faibussowitsch       PetscStreamType    tmp_type;
444738d3a5SJacob Faibussowitsch 
454738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextCreate(&tmp));
464738d3a5SJacob Faibussowitsch       // check this works through setup
474738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
484738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetUp(tmp));
494738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
504738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s after PetscDeviceContextSetUp"));
514738d3a5SJacob Faibussowitsch       // now change the stream type
524738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[j]));
534738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
544738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[j], "Set PetscDeviceStreamType %s does not match expected %s when changing after PetscDeviceContextSetUp"));
554738d3a5SJacob Faibussowitsch       // reset it back to original
564738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetStreamType(tmp, stypes[i]));
574738d3a5SJacob Faibussowitsch       // and ensure this works
584738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
594738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s after setting back to original"));
604738d3a5SJacob Faibussowitsch       // finally set up again
614738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextSetUp(tmp));
624738d3a5SJacob Faibussowitsch       // and ensure it has not changed
634738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextGetStreamType(tmp, &tmp_type));
644738d3a5SJacob Faibussowitsch       PetscCall(AssertPetscStreamTypesValidAndEqual(tmp_type, stypes[i], "Set PetscDeviceStreamType %s does not match expected %s after setting back to original and PetscDeviceContextSetUp"));
654738d3a5SJacob Faibussowitsch       PetscCall(PetscDeviceContextDestroy(&tmp));
664738d3a5SJacob Faibussowitsch     }
674738d3a5SJacob Faibussowitsch   }
684738d3a5SJacob Faibussowitsch 
694738d3a5SJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n"));
704738d3a5SJacob Faibussowitsch   PetscCall(PetscFinalize());
714738d3a5SJacob Faibussowitsch   return 0;
724738d3a5SJacob Faibussowitsch }
734738d3a5SJacob Faibussowitsch 
744738d3a5SJacob Faibussowitsch /*TEST
754738d3a5SJacob Faibussowitsch 
764738d3a5SJacob Faibussowitsch   testset:
77*27d4e10aSPierre Jolivet     requires: defined(PETSC_DEVICELANGUAGE_CXX)
7861c8d4edSPierre Jolivet     output_file: output/ExitSuccess.out
794738d3a5SJacob Faibussowitsch     args: -device_enable {{lazy eager}}
804738d3a5SJacob Faibussowitsch     test:
814738d3a5SJacob Faibussowitsch       requires: !device
824738d3a5SJacob Faibussowitsch       suffix: host_no_device
834738d3a5SJacob Faibussowitsch     test:
844738d3a5SJacob Faibussowitsch       requires: device
854738d3a5SJacob Faibussowitsch       args: -default_device_type host
864738d3a5SJacob Faibussowitsch       suffix: host_with_device
874738d3a5SJacob Faibussowitsch     test:
884738d3a5SJacob Faibussowitsch       requires: cuda
894738d3a5SJacob Faibussowitsch       args: -default_device_type cuda
904738d3a5SJacob Faibussowitsch       suffix: cuda
914738d3a5SJacob Faibussowitsch     test:
924738d3a5SJacob Faibussowitsch       requires: hip
934738d3a5SJacob Faibussowitsch       args: -default_device_type hip
944738d3a5SJacob Faibussowitsch       suffix: hip
954738d3a5SJacob Faibussowitsch     test:
964738d3a5SJacob Faibussowitsch       requires: sycl
974738d3a5SJacob Faibussowitsch       args: -default_device_type sycl
984738d3a5SJacob Faibussowitsch       suffix: sycl
994738d3a5SJacob Faibussowitsch 
1004738d3a5SJacob Faibussowitsch   test:
101*27d4e10aSPierre Jolivet     requires: !defined(PETSC_DEVICELANGUAGE_CXX)
10261c8d4edSPierre Jolivet     output_file: output/ExitSuccess.out
1034738d3a5SJacob Faibussowitsch     suffix: no_cxx
1044738d3a5SJacob Faibussowitsch 
1054738d3a5SJacob Faibussowitsch TEST*/
106