Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // Do the transfer in a CUDA stream parallel to the computation CUDA stream
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 // define as framework plugin
0074 DEFINE_FWK_MODULE(SiPixelDigisSoAFromCUDA);