Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-05 03:15:16

0001 #include <utility>
0002 #include <vector>
0003 
0004 #include <alpaka/alpaka.hpp>
0005 
0006 #include "DataFormats/ParticleFlowReco/interface/alpaka/PFRecHitDeviceCollection.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0010 #include "FWCore/Utilities/interface/InputTag.h"
0011 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/SynchronizingEDProducer.h"
0012 #include "RecoParticleFlow/PFRecHitProducer/interface/PFRecHitParamsRecord.h"
0013 #include "RecoParticleFlow/PFRecHitProducer/interface/PFRecHitTopologyRecord.h"
0014 
0015 #include "CalorimeterDefinitions.h"
0016 #include "PFRecHitProducerKernel.h"
0017 
0018 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0019   using namespace particleFlowRecHitProducer;
0020 
0021   template <typename CAL>
0022   class PFRecHitSoAProducer : public stream::SynchronizingEDProducer<> {
0023   public:
0024     PFRecHitSoAProducer(edm::ParameterSet const& config)
0025         : SynchronizingEDProducer(config),
0026           topologyToken_(esConsumes(config.getParameter<edm::ESInputTag>("topology"))),
0027           pfRecHitsToken_(produces()),
0028           sizeToken_(produces()),
0029           synchronise_(config.getUntrackedParameter<bool>("synchronise")),
0030           size_{cms::alpakatools::make_host_buffer<uint32_t, Platform>()} {
0031       const std::vector<edm::ParameterSet> producers = config.getParameter<std::vector<edm::ParameterSet>>("producers");
0032       recHitsToken_.reserve(producers.size());
0033       for (const edm::ParameterSet& producer : producers) {
0034         recHitsToken_.emplace_back(consumes(producer.getParameter<edm::InputTag>("src")),
0035                                    esConsumes(producer.getParameter<edm::ESInputTag>("params")));
0036       }
0037     }
0038 
0039     void acquire(device::Event const& event, const device::EventSetup& setup) override {
0040       const typename CAL::TopologyTypeDevice& topology = setup.getData(topologyToken_);
0041 
0042       uint32_t num_recHits = 0;
0043       for (const auto& token : recHitsToken_)
0044         num_recHits += event.get(token.first)->metadata().size();
0045 
0046       pfRecHits_.emplace((int)num_recHits, event.queue());
0047       *size_ = 0;
0048 
0049       if (num_recHits != 0) {
0050         PFRecHitProducerKernel<CAL> kernel{event.queue(), num_recHits};
0051         for (const auto& token : recHitsToken_)
0052           kernel.processRecHits(
0053               event.queue(), event.get(token.first), setup.getData(token.second), topology, *pfRecHits_);
0054         kernel.associateTopologyInfo(event.queue(), topology, *pfRecHits_);
0055         auto size_d = cms::alpakatools::make_device_view<uint32_t>(event.queue(), pfRecHits_->view().size());
0056         alpaka::memcpy(event.queue(), size_, size_d);
0057       }
0058     }
0059 
0060     void produce(device::Event& event, const device::EventSetup& setup) override {
0061       event.emplace(pfRecHitsToken_, std::move(*pfRecHits_));
0062       event.emplace(sizeToken_, *size_);
0063       pfRecHits_.reset();
0064 
0065       if (synchronise_)
0066         alpaka::wait(event.queue());
0067     }
0068 
0069     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0070       edm::ParameterSetDescription desc;
0071       edm::ParameterSetDescription producers;
0072       producers.add<edm::InputTag>("src", edm::InputTag(""))->setComment("Input CaloRecHitSoA");
0073       producers.add<edm::ESInputTag>("params", edm::ESInputTag(""))->setComment("Quality cut parameters");
0074       std::vector<edm::ParameterSet> producersDefault(1);
0075       producersDefault[0].addParameter<edm::InputTag>("src", edm::InputTag(""));
0076       producersDefault[0].addParameter<edm::ESInputTag>("params", edm::ESInputTag(""));
0077       desc.addVPSet("producers", producers, producersDefault)->setComment("List of inputs and quality cuts");
0078       desc.add<edm::ESInputTag>("topology", edm::ESInputTag(""))->setComment("Topology information");
0079       desc.addUntracked<bool>("synchronise", false)
0080           ->setComment("Add synchronisation point after execution (for benchmarking asynchronous execution)");
0081       descriptions.addWithDefaultLabel(desc);
0082     }
0083 
0084   private:
0085     // module configuration
0086     const device::ESGetToken<typename CAL::TopologyTypeDevice, typename CAL::TopologyRecordType> topologyToken_;
0087     std::vector<std::pair<device::EDGetToken<typename CAL::CaloRecHitSoATypeDevice>,
0088                           device::ESGetToken<typename CAL::ParameterType, typename CAL::ParameterRecordType>>>
0089         recHitsToken_;
0090     const device::EDPutToken<reco::PFRecHitDeviceCollection> pfRecHitsToken_;
0091     const edm::EDPutTokenT<cms_uint32_t> sizeToken_;
0092     const bool synchronise_;
0093 
0094     // data members used to communicate between acquire() and produce()
0095     cms::alpakatools::host_buffer<uint32_t> size_;
0096     std::optional<reco::PFRecHitDeviceCollection> pfRecHits_;
0097   };
0098 
0099   using PFRecHitSoAProducerHCAL = PFRecHitSoAProducer<HCAL>;
0100   using PFRecHitSoAProducerECAL = PFRecHitSoAProducer<ECAL>;
0101 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0102 
0103 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0104 DEFINE_FWK_ALPAKA_MODULE(PFRecHitSoAProducerHCAL);
0105 DEFINE_FWK_ALPAKA_MODULE(PFRecHitSoAProducerECAL);