CMS 3D CMS Logo

HcalRawToDigiGPU.cc
Go to the documentation of this file.
1 #include <iostream>
2 
16 
17 #include "DeclsForKernels.h"
18 #include "DecodeGPU.h"
19 #include "ElectronicsMappingGPU.h"
20 
21 class HcalRawToDigiGPU : public edm::stream::EDProducer<edm::ExternalWork> {
22 public:
23  explicit HcalRawToDigiGPU(edm::ParameterSet const& ps);
24  ~HcalRawToDigiGPU() override;
26 
27 private:
29  void produce(edm::Event&, edm::EventSetup const&) override;
30 
31 private:
39 
41 
42  std::vector<int> fedsToUnpack_;
43 
47 };
48 
51 
52  desc.add<edm::InputTag>("InputLabel", edm::InputTag("rawDataCollector"));
54  std::vector<int> feds(nFeds);
55  for (int i = 0; i < nFeds; ++i)
57  desc.add<std::vector<int>>("FEDs", feds);
58  desc.add<uint32_t>("maxChannelsF01HE", 10000u);
59  desc.add<uint32_t>("maxChannelsF5HB", 10000u);
60  desc.add<uint32_t>("maxChannelsF3HB", 10000u);
61  desc.add<uint32_t>("nsamplesF01HE", 8);
62  desc.add<uint32_t>("nsamplesF5HB", 8);
63  desc.add<uint32_t>("nsamplesF3HB", 8);
64  desc.add<std::string>("digisLabelF5HB", "f5HBDigisGPU");
65  desc.add<std::string>("digisLabelF01HE", "f01HEDigisGPU");
66  desc.add<std::string>("digisLabelF3HB", "f3HBDigisGPU");
67 
68  std::string label = "hcalRawToDigiGPU";
69  confDesc.add(label, desc);
70 }
71 
73  : rawDataToken_{consumes<FEDRawDataCollection>(ps.getParameter<edm::InputTag>("InputLabel"))},
74  digisF01HEToken_{produces<ProductTypef01>(ps.getParameter<std::string>("digisLabelF01HE"))},
75  digisF5HBToken_{produces<ProductTypef5>(ps.getParameter<std::string>("digisLabelF5HB"))},
76  digisF3HBToken_{produces<ProductTypef3>(ps.getParameter<std::string>("digisLabelF3HB"))},
77  fedsToUnpack_{ps.getParameter<std::vector<int>>("FEDs")} {
78  config_.maxChannelsF01HE = ps.getParameter<uint32_t>("maxChannelsF01HE");
79  config_.maxChannelsF5HB = ps.getParameter<uint32_t>("maxChannelsF5HB");
80  config_.maxChannelsF3HB = ps.getParameter<uint32_t>("maxChannelsF3HB");
81  config_.nsamplesF01HE = ps.getParameter<uint32_t>("nsamplesF01HE");
82  config_.nsamplesF5HB = ps.getParameter<uint32_t>("nsamplesF5HB");
83  config_.nsamplesF3HB = ps.getParameter<uint32_t>("nsamplesF3HB");
84 }
85 
87 
89  edm::EventSetup const& setup,
91  // raii
92  cms::cuda::ScopedContextAcquire ctx{event.streamID(), std::move(holder), cudaState_};
93 
94  // conditions
96  setup.get<HcalElectronicsMapRcd>().get(eMappingHandle);
97  auto const& eMappingProduct = eMappingHandle->getProduct(ctx.stream());
98 
99  // bundle up conditions
100  hcal::raw::ConditionsProducts conditions{eMappingProduct};
101 
102  // event data
103  edm::Handle<FEDRawDataCollection> rawDataHandle;
104  event.getByToken(rawDataToken_, rawDataHandle);
105 
106  // scratch
107  hcal::raw::ScratchDataGPU scratchGPU = {
108  cms::cuda::make_device_unique<uint32_t[]>(hcal::raw::numOutputCollections, ctx.stream())};
109 
110  // input cpu data
111  hcal::raw::InputDataCPU inputCPU = {cms::cuda::make_host_unique<unsigned char[]>(
113  cms::cuda::make_host_unique<uint32_t[]>(hcal::raw::utca_nfeds_max, ctx.stream()),
115 
116  // input data gpu
117  hcal::raw::InputDataGPU inputGPU = {
118  cms::cuda::make_device_unique<unsigned char[]>(hcal::raw::utca_nfeds_max * hcal::raw::nbytes_per_fed_max,
119  ctx.stream()),
120  cms::cuda::make_device_unique<uint32_t[]>(hcal::raw::utca_nfeds_max, ctx.stream()),
122 
123  // output cpu
124  outputCPU_ = {cms::cuda::make_host_unique<uint32_t[]>(hcal::raw::numOutputCollections, ctx.stream())};
125 
126  // output gpu
127  outputGPU_.allocate(config_, ctx.stream());
128 
129  // iterate over feds
130  // TODO: another idea
131  // - loop over all feds to unpack and enqueue cuda memcpy
132  // - accumulate the sizes
133  // - after the loop launch cuda memcpy for sizes
134  // - enqueue the kernel
135  uint32_t currentCummOffset = 0;
136  uint32_t counter = 0;
137  for (auto const& fed : fedsToUnpack_) {
138  auto const& data = rawDataHandle->FEDData(fed);
139  auto const nbytes = data.size();
140 
141  // skip empty feds
142  if (nbytes < hcal::raw::empty_event_size)
143  continue;
144 
145 #ifdef HCAL_RAWDECODE_CPUDEBUG
146  printf("fed = %d nbytes = %lu\n", fed, nbytes);
147 #endif
148 
149  // copy raw data into plain buffer
150  std::memcpy(inputCPU.data.get() + currentCummOffset, data.data(), nbytes);
151  // set the offset in bytes from the start
152  inputCPU.offsets[counter] = currentCummOffset;
153  inputCPU.feds[counter] = fed;
154 
155  // this is the current offset into the vector
156  currentCummOffset += nbytes;
157  ++counter;
158  }
159 
160  hcal::raw::entryPoint(inputCPU,
161  inputGPU,
162  outputGPU_,
163  scratchGPU,
164  outputCPU_,
165  conditions,
166  config_,
167  ctx.stream(),
168  counter,
169  currentCummOffset);
170 }
171 
174 
175 #ifdef HCAL_RAWDECODE_CPUDEBUG
176  printf("f01he channels = %u f5hb channesl = %u\n",
179 #endif
180 
181  // FIXME: use sizes of views directly for cuda mem cpy?
182  auto const nchannelsF01HE = outputCPU_.nchannels[hcal::raw::OutputF01HE];
183  auto const nchannelsF5HB = outputCPU_.nchannels[hcal::raw::OutputF5HB];
184  auto const nchannelsF3HB = outputCPU_.nchannels[hcal::raw::OutputF3HB];
185  outputGPU_.digisF01HE.size = nchannelsF01HE;
186  outputGPU_.digisF5HB.size = nchannelsF5HB;
187  outputGPU_.digisF3HB.size = nchannelsF3HB;
188  outputGPU_.digisF01HE.stride = hcal::compute_stride<hcal::Flavor1>(config_.nsamplesF01HE);
189  outputGPU_.digisF5HB.stride = hcal::compute_stride<hcal::Flavor5>(config_.nsamplesF5HB);
190  outputGPU_.digisF3HB.stride = hcal::compute_stride<hcal::Flavor3>(config_.nsamplesF3HB);
191 
195 
196  // reset ptrs that are carried as members
197  outputCPU_.nchannels.reset();
198 }
199 
FEDNumbering.h
l1tstage2emulator_dqm_sourceclient-live_cfg.feds
feds
Definition: l1tstage2emulator_dqm_sourceclient-live_cfg.py:152
counter
Definition: counter.py:1
DecodeGPU.h
mps_fire.i
i
Definition: mps_fire.py:428
HcalElectronicsMapRcd
Definition: HcalElectronicsMapRcd.h:8
HcalRawToDigiGPU::digisF3HBToken_
edm::EDPutTokenT< ProductTypef3 > digisF3HBToken_
Definition: HcalRawToDigiGPU.cc:38
HcalElectronicsMapRcd.h
cms::cuda::ScopedContextProduce
Definition: ScopedContext.h:149
cms::cuda::make_device_unique
device::impl::make_device_unique_selector< T >::non_array make_device_unique(cudaStream_t stream)
Definition: device_unique_ptr.h:52
edm::EDGetTokenT< FEDRawDataCollection >
edm::EDPutTokenT
Definition: EDPutToken.h:33
ElectronicsMappingGPU.h
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89285
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
hcal::raw::InputDataCPU::offsets
cms::cuda::host::unique_ptr< uint32_t[]> offsets
Definition: DeclsForKernels.h:38
HcalRawToDigiGPU::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &)
Definition: HcalRawToDigiGPU.cc:49
EDProducer.h
HcalRawToDigiGPU::produce
void produce(edm::Event &, edm::EventSetup const &) override
Definition: HcalRawToDigiGPU.cc:172
HcalRawToDigiGPU::config_
hcal::raw::ConfigurationParameters config_
Definition: HcalRawToDigiGPU.cc:44
hcal::raw::OutputF01HE
constexpr uint8_t OutputF01HE
Definition: DeclsForKernels.h:23
device_unique_ptr.h
edm::Handle< FEDRawDataCollection >
HcalRawToDigiGPU::outputCPU_
hcal::raw::OutputDataCPU outputCPU_
Definition: HcalRawToDigiGPU.cc:46
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
hcal::raw::ConfigurationParameters
Definition: DeclsForKernels.h:27
hcal::raw::OutputDataGPU::digisF5HB
DigiCollection< Flavor5, ::calo::common::DevStoragePolicy > digisF5HB
Definition: DeclsForKernels.h:54
HcalRawToDigiGPU::digisF01HEToken_
edm::EDPutTokenT< ProductTypef01 > digisF01HEToken_
Definition: HcalRawToDigiGPU.cc:34
edm::WaitingTaskWithArenaHolder
Definition: WaitingTaskWithArenaHolder.h:34
MakerMacros.h
hcal::raw::OutputF5HB
constexpr uint8_t OutputF5HB
Definition: DeclsForKernels.h:24
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
HcalRawToDigiGPU::digisF5HBToken_
edm::EDPutTokenT< ProductTypef5 > digisF5HBToken_
Definition: HcalRawToDigiGPU.cc:36
Service.h
edm::ESHandle
Definition: DTSurvey.h:22
hcal::raw::OutputDataGPU
Definition: DeclsForKernels.h:52
hcal::raw::OutputDataCPU
Definition: DeclsForKernels.h:42
HcalRawToDigiGPU::HcalRawToDigiGPU
HcalRawToDigiGPU(edm::ParameterSet const &ps)
Definition: HcalRawToDigiGPU.cc:72
hcal::raw::ConfigurationParameters::nsamplesF01HE
uint32_t nsamplesF01HE
Definition: DeclsForKernels.h:31
hcal::raw::empty_event_size
constexpr int32_t empty_event_size
Definition: DeclsForKernels.h:16
FEDRawDataCollection::FEDData
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
Definition: FEDRawDataCollection.cc:19
hcal::raw::ConfigurationParameters::nsamplesF5HB
uint32_t nsamplesF5HB
Definition: DeclsForKernels.h:32
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
hcal::raw::numOutputCollections
constexpr uint32_t numOutputCollections
Definition: DeclsForKernels.h:22
HcalRawToDigiGPU::acquire
void acquire(edm::Event const &, edm::EventSetup const &, edm::WaitingTaskWithArenaHolder) override
Definition: HcalRawToDigiGPU.cc:88
DeclsForKernels.h
cms::cuda::ContextState
Definition: ContextState.h:15
hcal::raw::nbytes_per_fed_max
constexpr uint32_t nbytes_per_fed_max
Definition: DeclsForKernels.h:18
HcalRawToDigiGPU::fedsToUnpack_
std::vector< int > fedsToUnpack_
Definition: HcalRawToDigiGPU.cc:42
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
hcal::raw::ElectronicsMappingGPU::getProduct
const Product & getProduct(cudaStream_t) const
Definition: ElectronicsMappingGPU.cc:37
hcal::raw::entryPoint
void entryPoint(InputDataCPU const &, InputDataGPU &, OutputDataGPU &, ScratchDataGPU &, OutputDataCPU &, ConditionsProducts const &, ConfigurationParameters const &, cudaStream_t cudaStream, uint32_t const, uint32_t const)
FEDNumbering::MAXHCALuTCAFEDID
Definition: FEDNumbering.h:104
hcal::raw::InputDataCPU::feds
cms::cuda::host::unique_ptr< int[]> feds
Definition: DeclsForKernels.h:39
FEDRawDataCollection.h
cudaCheck.h
edm::stream::EDProducer
Definition: EDProducer.h:38
counter
static std::atomic< unsigned int > counter
Definition: SharedResourceNames.cc:18
edm::EventSetup
Definition: EventSetup.h:58
hcal::raw::ConfigurationParameters::nsamplesF3HB
uint32_t nsamplesF3HB
Definition: DeclsForKernels.h:33
get
#define get
hcal::raw::InputDataCPU::data
cms::cuda::host::unique_ptr< unsigned char[]> data
Definition: DeclsForKernels.h:37
FEDNumbering::MINHCALuTCAFEDID
Definition: FEDNumbering.h:103
hcal::raw::OutputDataGPU::digisF01HE
DigiCollection< Flavor1, ::calo::common::DevStoragePolicy > digisF01HE
Definition: DeclsForKernels.h:53
CUDAService.h
cms::cuda::ScopedContextAcquire
Definition: ScopedContext.h:101
hcal::raw::InputDataGPU
Definition: DeclsForKernels.h:73
hcal::raw::InputDataCPU
Definition: DeclsForKernels.h:36
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
submitPVValidationJobs.conditions
list conditions
Definition: submitPVValidationJobs.py:674
eostools.move
def move(src, dest)
Definition: eostools.py:511
HcalRawToDigiGPU::outputGPU_
hcal::raw::OutputDataGPU outputGPU_
Definition: HcalRawToDigiGPU.cc:45
hcal::raw::OutputDataCPU::nchannels
cms::cuda::host::unique_ptr< uint32_t[]> nchannels
Definition: DeclsForKernels.h:43
hcal::raw::OutputDataGPU::digisF3HB
DigiCollection< Flavor3, ::calo::common::DevStoragePolicy > digisF3HB
Definition: DeclsForKernels.h:55
cms::cuda::Product
Definition: Product.h:34
ScopedContext.h
HcalRawToDigiGPU
Definition: HcalRawToDigiGPU.cc:21
hcal::raw::OutputF3HB
constexpr uint8_t OutputF3HB
Definition: DeclsForKernels.h:25
EventSetup.h
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
data
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
hcal::raw::ScratchDataGPU
Definition: DeclsForKernels.h:46
hcal::raw::ConditionsProducts
Definition: DeclsForKernels.h:79
hcal::raw::OutputDataGPU::allocate
void allocate(ConfigurationParameters const &config, cudaStream_t cudaStream)
Definition: DeclsForKernels.h:57
ParameterSet.h
HcalRawToDigiGPU::rawDataToken_
edm::EDGetTokenT< FEDRawDataCollection > rawDataToken_
Definition: HcalRawToDigiGPU.cc:32
cms::cuda::make_host_unique
host::impl::make_host_unique_selector< T >::non_array make_host_unique(cudaStream_t stream)
Definition: host_unique_ptr.h:41
event
Definition: event.py:1
edm::Event
Definition: Event.h:73
edm::InputTag
Definition: InputTag.h:15
label
const char * label
Definition: PFTauDecayModeTools.cc:11
HcalRawToDigiGPU::cudaState_
cms::cuda::ContextState cudaState_
Definition: HcalRawToDigiGPU.cc:40
HcalRawToDigiGPU::~HcalRawToDigiGPU
~HcalRawToDigiGPU() override
Definition: HcalRawToDigiGPU.cc:86
hcal::raw::utca_nfeds_max
constexpr uint32_t utca_nfeds_max
Definition: DeclsForKernels.h:17