diff --git a/reco/tasks/CMakeLists.txt b/reco/tasks/CMakeLists.txt index 4ba1d455fc63b76d40a8742c20514eb8fb0e09b0..e98d6b0599cd7946f14f78bc9ba6d257d75135de 100644 --- a/reco/tasks/CMakeLists.txt +++ b/reco/tasks/CMakeLists.txt @@ -2,7 +2,6 @@ # V. Friese, 2 June 2021 - # ----- Library name ---------------------------------- Set(LIBRARY_NAME CbmRecoTasks) # --------------------------------------------------------- @@ -81,6 +80,25 @@ endif() set(LINKDEF ${LIBRARY_NAME}LinkDef.h) # --------------------------------------------------------- +# Check if the compiler supports std::execution in the respective STL +# library +CHECK_CXX_SOURCE_COMPILES(" +#include <numeric> +#include <vector> +#include <execution> + +int main(int argc, char *argv[]) +{ + std::vector<double> v(10, 1); + + auto result = std::reduce(std::execution::par, v.begin(), v.end()); + return 0; +}" HAS_STD_EXECUTION) + +if (HAS_STD_EXECUTION) + message("Execution is available in STL") + add_definitions(-DWITH_EXECUTION) +endif() # ----- Let cmake do the job --------------------------- include_directories( ${INCLUDE_DIRECTORIES}) diff --git a/reco/tasks/CbmTaskUnpack.cxx b/reco/tasks/CbmTaskUnpack.cxx index 40eeb99a0bbfb2ba4193add4b2f6e259032c4d77..0d38ae69265e5060f1b30249fa6fb0e7beb1a60a 100644 --- a/reco/tasks/CbmTaskUnpack.cxx +++ b/reco/tasks/CbmTaskUnpack.cxx @@ -22,7 +22,9 @@ #include <algorithm> #include <cassert> #include <cstdint> +#ifdef WITH_EXECUTION #include <execution> +#endif #include <iomanip> #include <iostream> #include <memory> @@ -71,7 +73,7 @@ void CbmTaskUnpack::Exec(Option_t*) uint64_t numCompUsed = 0; // --- Component loop -#pragma omp parallel for schedule(dynamic) default(none) shared(timeslice) reduction(+: numMs, numBytes, numDigis, numCompUsed) +#pragma omp parallel for schedule(dynamic) shared(timeslice) reduction(+ : numMs, numBytes, numDigis, numCompUsed) for (uint64_t comp = 0; comp < timeslice->num_components(); comp++) { auto systemId = static_cast<fles::SubsystemIdentifier>(timeslice->descriptor(comp, 0).sys_id); @@ -124,9 +126,13 @@ void CbmTaskUnpack::Exec(Option_t*) } //# component // --- Sorting of output digis. Is required by both digi trigger and event builder. +#ifdef WITH_EXECUTION std::sort(std::execution::par_unseq, fTimeslice->fData.fSts.fDigis.begin(), fTimeslice->fData.fSts.fDigis.end(), [](CbmStsDigi digi1, CbmStsDigi digi2) { return digi1.GetTime() < digi2.GetTime(); }); - +#else + std::sort(fTimeslice->fData.fSts.fDigis.begin(), fTimeslice->fData.fSts.fDigis.end(), + [](CbmStsDigi digi1, CbmStsDigi digi2) { return digi1.GetTime() < digi2.GetTime(); }); +#endif // --- Timeslice log timer.Stop();