diff --git a/core/imt/test/CMakeLists.txt b/core/imt/test/CMakeLists.txt index c42fd22921379..6a2beb9568385 100644 --- a/core/imt/test/CMakeLists.txt +++ b/core/imt/test/CMakeLists.txt @@ -4,4 +4,4 @@ # For the licensing terms see $ROOTSYS/LICENSE. # For the list of contributors see $ROOTSYS/README/CREDITS. -ROOT_ADD_GTEST(testImt testRTaskArena.cxx testTFuture.cxx testTTaskGroup.cxx LIBRARIES Imt ${TBB_LIBRARIES}) +ROOT_ADD_GTEST(testImt testRTaskArena.cxx testTBBGlobalControl.cxx testTFuture.cxx testTTaskGroup.cxx LIBRARIES Imt ${TBB_LIBRARIES}) diff --git a/core/imt/test/testTBBGlobalControl.cxx b/core/imt/test/testTBBGlobalControl.cxx new file mode 100644 index 0000000000000..b1d7756335953 --- /dev/null +++ b/core/imt/test/testTBBGlobalControl.cxx @@ -0,0 +1,55 @@ +#include "TROOT.h" +#include "ROOT/RTaskArena.hxx" +#include "ROOT/TThreadExecutor.hxx" +#include "ROOTUnitTestSupport.h" +#include "gtest/gtest.h" +#include "tbb/global_control.h" + +#ifdef R__USE_IMT + +const unsigned maxConcurrency = ROOT::Internal::LogicalCPUBandwithControl(); + +TEST(TBBGlobalControl, RTaskArena) +{ + if (maxConcurrency <= 1) + return; // skip this test on systems with only 1 core + auto gTAInstance = ROOT::Internal::GetGlobalTaskArena(maxConcurrency); + tbb::global_control c(tbb::global_control::max_allowed_parallelism, 1u); + gTAInstance.reset(); + ROOT_EXPECT_WARNING(gTAInstance = ROOT::Internal::GetGlobalTaskArena(maxConcurrency);, + "RTaskArenaWrapper", + "tbb::global_control is active, limiting the number of parallel workers" + "from this task arena available for execution."); +} + +TEST(TBBGlobalControl, TThreadExecutor) +{ + // ***See them pass*** + ROOT::TThreadExecutor executor{maxConcurrency}; + executor.Map([]() { return 1; }, 10); // ParallelFor + std::vector vd{0., 1., 2.}; + executor.Reduce(vd, std::plus{}); // ParallelReduce double + std::vector vf{0., 1., 2.}; + executor.Reduce(vf, std::plus{}); // ParallelReduce float + + tbb::global_control c(tbb::global_control::max_allowed_parallelism, 1u); + + if (maxConcurrency <= 1) + return; // skip this test on systems with only 1 core + // ***See them warn*** + ROOT_EXPECT_WARNING(executor.Map([]() { return 1; }, 10), "TThreadExecutor::ParallelFor", + "tbb::global_control is limiting the number of parallel workers." + " Proceeding with 1 threads this time"); + + // ParallelReduce double + ROOT_EXPECT_WARNING(executor.Reduce(vd, std::plus{}), "TThreadExecutor::ParallelReduce", + "tbb::global_control is limiting the number of parallel workers." + " Proceeding with 1 threads this time"); + + // ParallelReduce float + ROOT_EXPECT_WARNING(executor.Reduce(vf, std::plus{}), "TThreadExecutor::ParallelReduce", + "tbb::global_control is limiting the number of parallel workers." + " Proceeding with 1 threads this time"); +} + +#endif