From 403050cd9268264c035753bd287208879480f2cb Mon Sep 17 00:00:00 2001 From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de> Date: Wed, 28 Jun 2023 11:14:16 +0000 Subject: [PATCH] algo::Unpack: Unpack TOF in parallel. --- algo/unpack/Unpack.cxx | 58 +++++++++++++++++++++++++++--------------- algo/unpack/Unpack.h | 7 ++++- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/algo/unpack/Unpack.cxx b/algo/unpack/Unpack.cxx index b4df2a746c..3a4b014125 100644 --- a/algo/unpack/Unpack.cxx +++ b/algo/unpack/Unpack.cxx @@ -33,6 +33,11 @@ namespace cbm::algo ParallelMsLoop(fParallelStsSetup, digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, fAlgoSts, 0x20); } + if (DetectorEnabled(fles::SubsystemIdentifier::RPC)) { + xpu::scoped_timer t1("TOF"); + ParallelMsLoop(fParallelTofSetup, digiTs.fData.fTof.fDigis, monitor.fTof, *timeslice, fAlgoTof, 0x00); + } + // --- Component loop for (uint64_t comp = 0; comp < timeslice->num_components(); comp++) { @@ -57,9 +62,9 @@ namespace cbm::algo if (systemId == fles::SubsystemIdentifier::MUCH) { MsLoop(timeslice, fAlgoMuch, comp, equipmentId, &digiTs.fData.fMuch.fDigis, monitor, &monitor.fMuch, 0x20); } - if (systemId == fles::SubsystemIdentifier::RPC) { - MsLoop(timeslice, fAlgoTof, comp, equipmentId, &digiTs.fData.fTof.fDigis, monitor, &monitor.fTof, 0x00); - } + // if (systemId == fles::SubsystemIdentifier::RPC) { + // MsLoop(timeslice, fAlgoTof, comp, equipmentId, &digiTs.fData.fTof.fDigis, monitor, &monitor.fTof, 0x00); + // } if (systemId == fles::SubsystemIdentifier::T0) { MsLoop(timeslice, fAlgoBmon, comp, equipmentId, &digiTs.fData.fT0.fDigis, monitor, &monitor.fBmon, 0x00); } @@ -317,30 +322,43 @@ namespace cbm::algo xpu::scoped_timer t("ParallelInit"); fParallelStsSetup = {}; + fParallelTofSetup = {}; - size_t numMs = 0; - size_t maxNumDigis = 0; for (uint64_t comp = 0; comp < timeslice.num_components(); comp++) { auto systemId = static_cast<fles::SubsystemIdentifier>(timeslice.descriptor(comp, 0).sys_id); - if (systemId == fles::SubsystemIdentifier::STS) { - uint64_t numMsInComp = timeslice.num_microslices(comp); - numMs += numMsInComp; - u16 componentId = timeslice.descriptor(comp, 0).eq_id; - for (uint64_t mslice = 0; mslice < numMsInComp; mslice++) { - uint64_t msByteSize = timeslice.descriptor(comp, mslice).size; - uint64_t numDigisInComp = msByteSize / sizeof(CbmStsDigi); - if (numDigisInComp > maxNumDigis) maxNumDigis = numDigisInComp; - fParallelStsSetup.msEquipmentIds.push_back(componentId); - fParallelStsSetup.msDescriptors.push_back(timeslice.descriptor(comp, mslice)); - fParallelStsSetup.msContent.push_back(timeslice.content(comp, mslice)); - } + switch (systemId) { + case fles::SubsystemIdentifier::STS: ParallelInitComponent(fParallelStsSetup, timeslice, comp); break; + case fles::SubsystemIdentifier::RPC: ParallelInitComponent(fParallelTofSetup, timeslice, comp); break; + default: break; } } - fParallelStsSetup.msDigis.resize(numMs); - fParallelStsSetup.msMonitorData.resize(numMs); + fParallelStsSetup.msDigis.resize(fParallelStsSetup.numMs); + fParallelStsSetup.msMonitorData.resize(fParallelStsSetup.numMs); + fParallelTofSetup.msDigis.resize(fParallelTofSetup.numMs); + fParallelTofSetup.msMonitorData.resize(fParallelTofSetup.numMs); } // ---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- + template<class Digi, class Monitor> + void Unpack::ParallelInitComponent(ParallelSetup<Digi, Monitor>& setup, const fles::Timeslice& timeslice, + u64 component) + { + auto& msDesc = setup.msDescriptors; + auto& msEqIds = setup.msEquipmentIds; + auto& msContent = setup.msContent; + + u64 numMsInComp = timeslice.num_microslices(component); + u16 componentId = timeslice.descriptor(component, 0).eq_id; + setup.numMs += numMsInComp; + for (u64 mslice = 0; mslice < numMsInComp; mslice++) { + uint64_t msByteSize = timeslice.descriptor(component, mslice).size; + msEqIds.push_back(componentId); + msDesc.push_back(timeslice.descriptor(component, mslice)); + msContent.push_back(timeslice.content(component, mslice)); + } + } + // ---------------------------------------------------------------------------- template<class Digi, class UnpackAlgo, class Monitor> void Unpack::ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut, @@ -357,7 +375,7 @@ namespace cbm::algo xpu::push_timer("Unpack"); #pragma omp parallel for schedule(dynamic) for (size_t i = 0; i < numMs; i++) { - auto result = fAlgoSts.at(msEqIds[i])(msContent[i], msDesc[i], ts.start_time()); + auto result = algos.at(msEqIds[i])(msContent[i], msDesc[i], ts.start_time()); msDigis[i] = std::move(result.first); monitor[i] = std::move(result.second); } diff --git a/algo/unpack/Unpack.h b/algo/unpack/Unpack.h index dd87b0dd2d..94dce34b0d 100644 --- a/algo/unpack/Unpack.h +++ b/algo/unpack/Unpack.h @@ -133,6 +133,7 @@ namespace cbm::algo private: // types template<class Digi, class Monitor> struct ParallelSetup { + size_t numMs = 0; std::vector<u16> msEquipmentIds; std::vector<fles::MicrosliceDescriptor> msDescriptors; std::vector<const u8*> msContent; @@ -150,6 +151,9 @@ namespace cbm::algo /** Init parallel unpacker */ void ParallelInit(const fles::Timeslice& timeslice); + template<class Digi, class Monitor> + void ParallelInitComponent(ParallelSetup<Digi, Monitor>& setup, const fles::Timeslice& timeslice, u64 component); + /** @brief Parallel microslice loop **/ template<class Digi, class UnpackAlgo, class Monitor> void ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut, std::vector<Monitor>& monitor, @@ -188,7 +192,8 @@ namespace cbm::algo {fles::SubsystemIdentifier::T0, 0}, {fles::SubsystemIdentifier::TRD, 1300}, {fles::SubsystemIdentifier::TRD2D, -510}}; /** @brief Parallel STS Setup */ - ParallelSetup<sts::Digi, UnpackStsMonitorData> fParallelStsSetup = {}; + ParallelSetup<sts::Digi, UnpackStsMonitorData> fParallelStsSetup = {}; + ParallelSetup<CbmTofDigi, UnpackTofMonitorData> fParallelTofSetup = {}; }; } // namespace cbm::algo -- GitLab