CMS 3D CMS Logo

SiPixelRecHitFromCUDA.cc
Go to the documentation of this file.
1 #include <cuda_runtime.h>
2 
3 #include <fmt/printf.h>
4 
26 
27 class SiPixelRecHitFromCUDA : public edm::stream::EDProducer<edm::ExternalWork> {
28 public:
29  explicit SiPixelRecHitFromCUDA(const edm::ParameterSet& iConfig);
30  ~SiPixelRecHitFromCUDA() override = default;
31 
32  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
33 
35 
36 private:
37  void acquire(edm::Event const& iEvent,
38  edm::EventSetup const& iSetup,
39  edm::WaitingTaskWithArenaHolder waitingTaskHolder) override;
40  void produce(edm::Event& iEvent, edm::EventSetup const& iSetup) override;
41 
47 
48  uint32_t nHits_;
51 };
52 
54  : geomToken_(esConsumes()),
55  hitsToken_(
56  consumes<cms::cuda::Product<TrackingRecHit2DGPU>>(iConfig.getParameter<edm::InputTag>("pixelRecHitSrc"))),
57  clusterToken_(consumes<SiPixelClusterCollectionNew>(iConfig.getParameter<edm::InputTag>("src"))),
58  rechitsPutToken_(produces<SiPixelRecHitCollection>()),
59  hostPutToken_(produces<HMSstorage>()) {}
60 
63  desc.add<edm::InputTag>("pixelRecHitSrc", edm::InputTag("siPixelRecHitsPreSplittingCUDA"));
64  desc.add<edm::InputTag>("src", edm::InputTag("siPixelClustersPreSplitting"));
65  descriptions.addWithDefaultLabel(desc);
66 }
67 
69  edm::EventSetup const& iSetup,
70  edm::WaitingTaskWithArenaHolder waitingTaskHolder) {
71  cms::cuda::Product<TrackingRecHit2DGPU> const& inputDataWrapped = iEvent.get(hitsToken_);
72  cms::cuda::ScopedContextAcquire ctx{inputDataWrapped, std::move(waitingTaskHolder)};
73  auto const& inputData = ctx.get(inputDataWrapped);
74 
75  nHits_ = inputData.nHits();
76 
77  LogDebug("SiPixelRecHitFromCUDA") << "converting " << nHits_ << " Hits";
78 
79  if (0 == nHits_)
80  return;
81  store32_ = inputData.localCoordToHostAsync(ctx.stream());
82  hitsModuleStart_ = inputData.hitsModuleStartToHostAsync(ctx.stream());
83 }
84 
86  // allocate a buffer for the indices of the clusters
87  auto hmsp = std::make_unique<uint32_t[]>(gpuClustering::maxNumModules + 1);
88 
91 
92  if (0 == nHits_) {
94  iEvent.emplace(hostPutToken_, std::move(hmsp));
95  return;
96  }
98 
100  // wrap the buffer in a HostProduct, and move it to the Event, without reallocating the buffer or affecting hitsModuleStart
101  iEvent.emplace(hostPutToken_, std::move(hmsp));
102 
103  auto xl = store32_.get();
104  auto yl = xl + nHits_;
105  auto xe = yl + nHits_;
106  auto ye = xe + nHits_;
107 
108  const TrackerGeometry* geom = &es.getData(geomToken_);
109 
111  auto const& input = *hclusters;
112 
113  constexpr uint32_t maxHitsInModule = gpuClustering::maxHitsInModule();
114 
115  int numberOfDetUnits = 0;
116  int numberOfClusters = 0;
117  for (auto const& dsv : input) {
118  numberOfDetUnits++;
119  unsigned int detid = dsv.detId();
120  DetId detIdObject(detid);
121  const GeomDetUnit* genericDet = geom->idToDetUnit(detIdObject);
122  auto gind = genericDet->index();
123  const PixelGeomDetUnit* pixDet = dynamic_cast<const PixelGeomDetUnit*>(genericDet);
124  assert(pixDet);
125  SiPixelRecHitCollection::FastFiller recHitsOnDetUnit(output, detid);
126  auto fc = hitsModuleStart_[gind];
127  auto lc = hitsModuleStart_[gind + 1];
128  auto nhits = lc - fc;
129 
130  assert(lc > fc);
131  LogDebug("SiPixelRecHitFromCUDA") << "in det " << gind << ": conv " << nhits << " hits from " << dsv.size()
132  << " legacy clusters" << ' ' << fc << ',' << lc;
133  if (nhits > maxHitsInModule)
134  edm::LogWarning("SiPixelRecHitFromCUDA") << fmt::sprintf(
135  "Too many clusters %d in module %d. Only the first %d hits will be converted", nhits, gind, maxHitsInModule);
137 
138  LogDebug("SiPixelRecHitFromCUDA") << "in det " << gind << "conv " << nhits << " hits from " << dsv.size()
139  << " legacy clusters" << ' ' << lc << ',' << fc;
140 
141  if (0 == nhits)
142  continue;
143  auto jnd = [&](int k) { return fc + k; };
144  assert(nhits <= dsv.size());
145  if (nhits != dsv.size()) {
146  edm::LogWarning("GPUHits2CPU") << "nhits!= nclus " << nhits << ' ' << dsv.size();
147  }
148  for (auto const& clust : dsv) {
149  assert(clust.originalId() >= 0);
150  assert(clust.originalId() < dsv.size());
151  if (clust.originalId() >= nhits)
152  continue;
153  auto ij = jnd(clust.originalId());
154  LocalPoint lp(xl[ij], yl[ij]);
155  LocalError le(xe[ij], 0, ye[ij]);
157 
158  numberOfClusters++;
159 
160  /* cpu version.... (for reference)
161  std::tuple<LocalPoint, LocalError, SiPixelRecHitQuality::QualWordType> tuple = cpe_->getParameters( clust, *genericDet );
162  LocalPoint lp( std::get<0>(tuple) );
163  LocalError le( std::get<1>(tuple) );
164  SiPixelRecHitQuality::QualWordType rqw( std::get<2>(tuple) );
165  */
166 
167  // Create a persistent edm::Ref to the cluster
169  // Make a RecHit and add it to the DetSet
170  recHitsOnDetUnit.emplace_back(lp, le, rqw, *genericDet, cluster);
171  // =============================
172 
173  LogDebug("SiPixelRecHitFromCUDA") << "cluster " << numberOfClusters << " at " << lp << ' ' << le;
174 
175  } // <-- End loop on Clusters
176 
177  // LogDebug("SiPixelRecHitGPU")
178  LogDebug("SiPixelRecHitFromCUDA") << "found " << recHitsOnDetUnit.size() << " RecHits on " << detid;
179 
180  } // <-- End loop on DetUnits
181 
182  LogDebug("SiPixelRecHitFromCUDA") << "found " << numberOfDetUnits << " dets, " << numberOfClusters << " clusters";
183 
185 }
186 
ConfigurationDescriptions.h
SiPixelRecHitFromCUDA::hostPutToken_
const edm::EDPutTokenT< HMSstorage > hostPutToken_
Definition: SiPixelRecHitFromCUDA.cc:46
pixelCPEforGPU.h
Handle.h
gpuClustering::maxHitsInModule
constexpr uint32_t maxHitsInModule()
Definition: gpuClusteringConstants.h:16
input
static const std::string input
Definition: EdmProvDump.cc:48
MessageLogger.h
TrackerGeometry.h
GeomDet
Definition: GeomDet.h:27
filterCSVwithJSON.copy
copy
Definition: filterCSVwithJSON.py:36
convertSQLitetoXML_cfg.output
output
Definition: convertSQLitetoXML_cfg.py:72
min
T min(T a, T b)
Definition: MathUtil.h:58
edm::EDGetTokenT
Definition: EDGetToken.h:33
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::EDPutTokenT
Definition: EDPutToken.h:33
TrackingRecHit2DHeterogeneous.h
SiPixelRecHitFromCUDA::store32_
cms::cuda::host::unique_ptr< float[]> store32_
Definition: SiPixelRecHitFromCUDA.cc:49
SiPixelCluster.h
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
edmNew::makeRefTo
edm::Ref< typename HandleT::element_type, typename HandleT::element_type::value_type::value_type > makeRefTo(const HandleT &iHandle, typename HandleT::element_type::value_type::const_iterator itIter)
Definition: DetSetVectorNew.h:704
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
TrackingRecHit2DHeterogeneous
Definition: TrackingRecHit2DHeterogeneous.h:8
SiPixelRecHitFromCUDA::SiPixelRecHitFromCUDA
SiPixelRecHitFromCUDA(const edm::ParameterSet &iConfig)
Definition: SiPixelRecHitFromCUDA.cc:53
cms::cuda::assert
assert(be >=bs)
EDProducer.h
HostProduct.h
GeomDet::index
int index() const
Definition: GeomDet.h:83
SiPixelCluster
Pixel cluster – collection of neighboring pixels above threshold.
Definition: SiPixelCluster.h:28
SiPixelRecHitFromCUDA::acquire
void acquire(edm::Event const &iEvent, edm::EventSetup const &iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) override
Definition: SiPixelRecHitFromCUDA.cc:68
edm::Handle
Definition: AssociativeIterator.h:50
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
edm::Ref
Definition: AssociativeIterator.h:58
DetId
Definition: DetId.h:17
edm::WaitingTaskWithArenaHolder
Definition: WaitingTaskWithArenaHolder.h:34
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
SiPixelRecHitFromCUDA
Definition: SiPixelRecHitFromCUDA.cc:27
SiPixelRecHitFromCUDA::hitsModuleStart_
cms::cuda::host::unique_ptr< uint32_t[]> hitsModuleStart_
Definition: SiPixelRecHitFromCUDA.cc:50
SiPixelRecHitQuality::QualWordType
unsigned int QualWordType
Definition: SiPixelRecHitQuality.h:9
PixelGeomDetUnit
Definition: PixelGeomDetUnit.h:15
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
dqmdumpme.k
k
Definition: dqmdumpme.py:60
Point3DBase< float, LocalTag >
ParameterSetDescription.h
nhits
Definition: HIMultiTrackSelector.h:42
gpuClustering::maxNumModules
constexpr uint16_t maxNumModules
Definition: gpuClusteringConstants.h:18
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
SiPixelRecHitFromCUDA::~SiPixelRecHitFromCUDA
~SiPixelRecHitFromCUDA() override=default
SiPixelRecHitFromCUDA::produce
void produce(edm::Event &iEvent, edm::EventSetup const &iSetup) override
Definition: SiPixelRecHitFromCUDA.cc:85
TrackerDigiGeometryRecord.h
SiPixelRecHitCollection.h
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
edm::ParameterSet
Definition: ParameterSet.h:47
HostProduct
Definition: HostProduct.h:8
Event.h
LocalError
Definition: LocalError.h:12
iEvent
int iEvent
Definition: GenABIO.cc:224
edm::stream::EDProducer
Definition: EDProducer.h:36
edm::EventSetup
Definition: EventSetup.h:58
SiPixelRecHitFromCUDA::rechitsPutToken_
const edm::EDPutTokenT< SiPixelRecHitCollection > rechitsPutToken_
Definition: SiPixelRecHitFromCUDA.cc:45
SiPixelRecHitFromCUDA::geomToken_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
Definition: SiPixelRecHitFromCUDA.cc:42
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord >
SiPixelRecHitFromCUDA::clusterToken_
const edm::EDGetTokenT< SiPixelClusterCollectionNew > clusterToken_
Definition: SiPixelRecHitFromCUDA.cc:44
InputTag.h
edm::EventSetup::getData
bool getData(T &iHolder) const
Definition: EventSetup.h:127
edmNew::DetSetVector::FastFiller::size
size_type size() const
Definition: DetSetVectorNew.h:268
cms::cuda::ScopedContextAcquire
Definition: ScopedContext.h:101
Product.h
edmNew::DetSetVector
Definition: DetSetNew.h:13
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
cms::cuda::host::unique_ptr
std::unique_ptr< T, impl::HostDeleter > unique_ptr
Definition: host_unique_ptr.h:21
cms::cuda::Product
Definition: Product.h:34
ScopedContext.h
PixelGeomDetUnit.h
ecalDigis_cff.cuda
cuda
Definition: ecalDigis_cff.py:35
EventSetup.h
SiPixelRecHitFromCUDA::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: SiPixelRecHitFromCUDA.cc:61
edmNew::DetSetVector::FastFiller
Definition: DetSetVectorNew.h:202
ParameterSet.h
SiPixelRecHitFromCUDA::nHits_
uint32_t nHits_
Definition: SiPixelRecHitFromCUDA.cc:48
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
DetSetVectorNew.h
edm::InputTag
Definition: InputTag.h:15
edmNew::DetSetVector::FastFiller::emplace_back
void emplace_back(Args &&... args)
Definition: DetSetVectorNew.h:276
edm::ConfigurationDescriptions::addWithDefaultLabel
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:87
cms
Namespace of DDCMS conversion namespace.
Definition: ProducerAnalyzer.cc:21
SiPixelRecHitFromCUDA::hitsToken_
const edm::EDGetTokenT< cms::cuda::Product< TrackingRecHit2DGPU > > hitsToken_
Definition: SiPixelRecHitFromCUDA.cc:43
TrackerGeometry
Definition: TrackerGeometry.h:14