File indexing completed on 2023-03-17 11:00:17
0001 #include "CUDADataFormats/Common/interface/Product.h"
0002 #include "CUDADataFormats/SiPixelDigi/interface/SiPixelDigisCUDA.h"
0003 #include "DataFormats/SiPixelDigi/interface/SiPixelDigisSoA.h"
0004 #include "FWCore/Framework/interface/EventSetup.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 #include "FWCore/Framework/interface/stream/EDProducer.h"
0008 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "HeterogeneousCore/CUDACore/interface/ScopedContext.h"
0012 #include "HeterogeneousCore/CUDAUtilities/interface/host_unique_ptr.h"
0013 #include "CUDADataFormats/Common/interface/PortableHostCollection.h"
0014
0015 class SiPixelDigisSoAFromCUDA : public edm::stream::EDProducer<edm::ExternalWork> {
0016 public:
0017 explicit SiPixelDigisSoAFromCUDA(const edm::ParameterSet& iConfig);
0018 ~SiPixelDigisSoAFromCUDA() override = default;
0019
0020 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0021
0022 private:
0023 void acquire(const edm::Event& iEvent,
0024 const edm::EventSetup& iSetup,
0025 edm::WaitingTaskWithArenaHolder waitingTaskHolder) override;
0026 void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0027
0028 edm::EDGetTokenT<cms::cuda::Product<SiPixelDigisCUDA>> digiGetToken_;
0029 edm::EDPutTokenT<SiPixelDigisSoA> digiPutToken_;
0030
0031 cms::cuda::PortableHostCollection<SiPixelDigisSoALayout<>> digis_h_;
0032
0033 int nDigis_;
0034 };
0035
0036 SiPixelDigisSoAFromCUDA::SiPixelDigisSoAFromCUDA(const edm::ParameterSet& iConfig)
0037 : digiGetToken_(consumes<cms::cuda::Product<SiPixelDigisCUDA>>(iConfig.getParameter<edm::InputTag>("src"))),
0038 digiPutToken_(produces<SiPixelDigisSoA>()) {}
0039
0040 void SiPixelDigisSoAFromCUDA::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0041 edm::ParameterSetDescription desc;
0042 desc.add<edm::InputTag>("src", edm::InputTag("siPixelClustersCUDA"));
0043 descriptions.addWithDefaultLabel(desc);
0044 }
0045
0046 void SiPixelDigisSoAFromCUDA::acquire(const edm::Event& iEvent,
0047 const edm::EventSetup& iSetup,
0048 edm::WaitingTaskWithArenaHolder waitingTaskHolder) {
0049
0050 cms::cuda::ScopedContextAcquire ctx{iEvent.streamID(), std::move(waitingTaskHolder)};
0051
0052 const auto& digis_d = ctx.get(iEvent, digiGetToken_);
0053
0054 nDigis_ = digis_d.nDigis();
0055 nDigis_ = digis_d.nDigis();
0056 digis_h_ = cms::cuda::PortableHostCollection<SiPixelDigisSoALayout<>>(digis_d.view().metadata().size(), ctx.stream());
0057 cudaCheck(cudaMemcpyAsync(digis_h_.buffer().get(),
0058 digis_d.const_buffer().get(),
0059 digis_d.bufferSize(),
0060 cudaMemcpyDeviceToHost,
0061 ctx.stream()));
0062 }
0063
0064 void SiPixelDigisSoAFromCUDA::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0065 iEvent.emplace(digiPutToken_,
0066 nDigis_,
0067 digis_h_.view().pdigi(),
0068 digis_h_.view().rawIdArr(),
0069 digis_h_.view().adc(),
0070 digis_h_.view().clus());
0071 }
0072
0073
0074 DEFINE_FWK_MODULE(SiPixelDigisSoAFromCUDA);