CMS 3D CMS Logo

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