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
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
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 }
0102
0103 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0104 DEFINE_FWK_ALPAKA_MODULE(PFRecHitSoAProducerHCAL);
0105 DEFINE_FWK_ALPAKA_MODULE(PFRecHitSoAProducerECAL);