diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelPhase2DigiToCluster.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelPhase2DigiToCluster.cc index ce337a848d952..f4a4b34a9b7f3 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelPhase2DigiToCluster.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelPhase2DigiToCluster.cc @@ -141,8 +141,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { } digis_d_ = SiPixelDigisSoACollection(iEvent.queue(), nDigis_); - if (nDigis_ == 0) + if (nDigis_ == 0) { + algo_.zeroInitializePhase2Clusters(iEvent.queue()); return; + } SiPixelDigisHost digis_h(iEvent.queue(), nDigis_); @@ -170,14 +172,11 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { } void SiPixelPhase2DigiToCluster::produce(device::Event& iEvent, device::EventSetup const& iSetup) { - if (nDigis_ == 0) { - iEvent.emplace(digiPutToken_, std::move(*digis_d_)); - iEvent.emplace(clusterPutToken_, iEvent.queue(), pixelTopology::Phase2::numberOfModules); - } else { + if (nDigis_ != 0) digis_d_->setNModules(algo_.nModules()); - iEvent.emplace(digiPutToken_, std::move(*digis_d_)); - iEvent.emplace(clusterPutToken_, algo_.getClusters()); - } + + iEvent.emplace(digiPutToken_, std::move(*digis_d_)); + iEvent.emplace(clusterPutToken_, algo_.getClusters()); digis_d_.reset(); } diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.dev.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.dev.cc index 810f2e8a168cd..2a7a15c51e7af 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.dev.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.dev.cc @@ -771,6 +771,19 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { #endif } // + // Function to zero-initialize the clusters + template + void SiPixelRawToClusterKernel::zeroInitializePhase2Clusters(Queue &queue) { + constexpr int numberOfModules = pixelTopology::Phase2::numberOfModules; + clusters_d = SiPixelClustersSoACollection(queue, numberOfModules); + clusters_d->zeroInitialise(queue); + // set moduleStartFirstElement, moduleStartLastElement and bpix2ClusterStart on the host to zero + // these changes are later propagated to the device portable collection during getDigis() and getClusters() + nModules_Clusters_h[0] = 0; + nModules_Clusters_h[1] = 0; + nModules_Clusters_h[2] = 0; + } + template class SiPixelRawToClusterKernel; template class SiPixelRawToClusterKernel; template class SiPixelRawToClusterKernel; diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.h index cd50ff4eca8e7..33be7ba434016 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/SiPixelRawToClusterKernel.h @@ -177,6 +177,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { const uint32_t numDigis, const uint32_t offsetBPIX2); + void zeroInitializePhase2Clusters(Queue& queue); + SiPixelDigisSoACollection getDigis() { digis_d->setNModules(nModules_Clusters_h[0]); return std::move(*digis_d);