CMS 3D CMS Logo

gpuClusterChargeCut.h
Go to the documentation of this file.
1 #ifndef RecoLocalTracker_SiPixelClusterizer_plugins_gpuClusterChargeCut_h
2 #define RecoLocalTracker_SiPixelClusterizer_plugins_gpuClusterChargeCut_h
3 
4 #include <cstdint>
5 #include <cstdio>
6 
11 
12 // local include(s)
14 
15 namespace gpuClustering {
16 
19  clusterThresholds, // charge cut on cluster in electrons (for layer 1 and for other layers)
20  uint16_t* __restrict__ id, // module id of each pixel (modified if bad cluster)
21  uint16_t const* __restrict__ adc, // charge of each pixel
22  uint32_t const* __restrict__ moduleStart, // index of the first pixel of each module
23  uint32_t* __restrict__ nClustersInModule, // modified: number of clusters found in each module
24  uint32_t const* __restrict__ moduleId, // module id of each module
25  int32_t* __restrict__ clusterId, // modified: cluster id of each pixel
26  uint32_t numElements) {
27  __shared__ int32_t charge[maxNumClustersPerModules];
28  __shared__ uint8_t ok[maxNumClustersPerModules];
29  __shared__ uint16_t newclusId[maxNumClustersPerModules];
30 
33  for (auto module = firstModule; module < endModule; module += gridDim.x) {
34  auto firstPixel = moduleStart[1 + module];
35  auto thisModuleId = id[firstPixel];
36  assert(thisModuleId < maxNumModules);
37  assert(thisModuleId == moduleId[module]);
38 
39  auto nclus = nClustersInModule[thisModuleId];
40  if (nclus == 0)
41  continue;
42 
43  if (threadIdx.x == 0 && nclus > maxNumClustersPerModules)
44  printf("Warning too many clusters in module %d in block %d: %d > %d\n",
45  thisModuleId,
46  blockIdx.x,
47  nclus,
49 
50  auto first = firstPixel + threadIdx.x;
51 
52  if (nclus > maxNumClustersPerModules) {
53  // remove excess FIXME find a way to cut charge first....
54  for (auto i = first; i < numElements; i += blockDim.x) {
55  if (id[i] == invalidModuleId)
56  continue; // not valid
57  if (id[i] != thisModuleId)
58  break; // end of module
60  id[i] = invalidModuleId;
62  }
63  }
65  }
66 
67 #ifdef GPU_DEBUG
68  if (thisModuleId % 100 == 1)
69  if (threadIdx.x == 0)
70  printf("start cluster charge cut for module %d in block %d\n", thisModuleId, blockIdx.x);
71 #endif
72 
74  for (auto i = threadIdx.x; i < nclus; i += blockDim.x) {
75  charge[i] = 0;
76  }
77  __syncthreads();
78 
79  for (auto i = first; i < numElements; i += blockDim.x) {
80  if (id[i] == invalidModuleId)
81  continue; // not valid
82  if (id[i] != thisModuleId)
83  break; // end of module
85  }
86  __syncthreads();
87 
88  auto chargeCut =
89  clusterThresholds.getThresholdForLayerOnCondition(thisModuleId < phase1PixelTopology::layerStart[1]);
90  for (auto i = threadIdx.x; i < nclus; i += blockDim.x) {
91  newclusId[i] = ok[i] = charge[i] > chargeCut ? 1 : 0;
92  }
93 
94  __syncthreads();
95 
96  // renumber
97  __shared__ uint16_t ws[32];
98  cms::cuda::blockPrefixScan(newclusId, nclus, ws);
99 
100  assert(nclus >= newclusId[nclus - 1]);
101 
102  if (nclus == newclusId[nclus - 1])
103  continue;
104 
105  nClustersInModule[thisModuleId] = newclusId[nclus - 1];
106  __syncthreads();
107 
108  // mark bad cluster again
109  for (auto i = threadIdx.x; i < nclus; i += blockDim.x) {
110  if (0 == ok[i])
111  newclusId[i] = invalidModuleId + 1;
112  }
113  __syncthreads();
114 
115  // reassign id
116  for (auto i = first; i < numElements; i += blockDim.x) {
117  if (id[i] == invalidModuleId)
118  continue; // not valid
119  if (id[i] != thisModuleId)
120  break; // end of module
121  clusterId[i] = newclusId[clusterId[i]] - 1;
122  if (clusterId[i] == invalidModuleId)
123  id[i] = invalidModuleId;
124  }
125 
126  //done
127  } // loop on modules
128  }
129 
130 } // namespace gpuClustering
131 
132 #endif // RecoLocalTracker_SiPixelClusterizer_plugins_gpuClusterChargeCut_h
gpuClustering
Definition: gpuClusteringConstants.h:7
SiPixelClusterThresholds::getThresholdForLayerOnCondition
constexpr int32_t getThresholdForLayerOnCondition(bool isLayer1) const noexcept
Definition: SiPixelClusterThresholds.h:5
mps_fire.i
i
Definition: mps_fire.py:428
gpuClustering::adc
uint16_t *__restrict__ uint16_t const *__restrict__ adc
Definition: gpuClusterChargeCut.h:20
SiPixelClusterThresholds
Definition: SiPixelClusterThresholds.h:4
cms::cuda::assert
assert(be >=bs)
cms::cudacompat::__syncthreads
void __syncthreads()
Definition: cudaCompat.h:108
gpuClustering::firstModule
auto firstModule
Definition: gpuClusterChargeCut.h:31
gpuVertexFinder::ws
auto &__restrict__ ws
Definition: gpuClusterTracksDBSCAN.h:32
gpuClustering::moduleId
uint16_t *__restrict__ uint16_t const *__restrict__ uint32_t const *__restrict__ uint32_t *__restrict__ uint32_t const *__restrict__ moduleId
Definition: gpuClusterChargeCut.h:20
gpuClustering::numElements
uint16_t *__restrict__ uint16_t const *__restrict__ uint32_t const *__restrict__ uint32_t *__restrict__ uint32_t const *__restrict__ int32_t *__restrict__ uint32_t numElements
Definition: gpuClusterChargeCut.h:26
__global__
#define __global__
Definition: cudaCompat.h:19
gpuClustering::moduleStart
uint16_t *__restrict__ uint16_t const *__restrict__ uint32_t const *__restrict__ moduleStart
Definition: gpuClusterChargeCut.h:20
prefixScan.h
SiPixelClusterThresholds.h
cms::cudacompat::atomicAdd
T1 atomicAdd(T1 *a, T2 b)
Definition: cudaCompat.h:61
gpuClustering::clusterId
uint16_t *__restrict__ uint16_t const *__restrict__ uint32_t const *__restrict__ uint32_t *__restrict__ uint32_t const *__restrict__ int32_t *__restrict__ clusterId
Definition: gpuClusterChargeCut.h:20
gpuClustering::maxNumModules
constexpr uint16_t maxNumModules
Definition: gpuClusteringConstants.h:18
first
auto first
Definition: CAHitNtupletGeneratorKernelsImpl.h:125
cms::cudacompat::gridDim
const dim3 gridDim
Definition: cudaCompat.h:33
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
cms::cudacompat::blockDim
const dim3 blockDim
Definition: cudaCompat.h:30
gpuClustering::invalidModuleId
constexpr uint16_t invalidModuleId
Definition: gpuClusteringConstants.h:20
gpuClusteringConstants.h
gpuClustering::maxNumClustersPerModules
constexpr int32_t maxNumClustersPerModules
Definition: gpuClusteringConstants.h:19
cms::cudacompat::threadIdx
const dim3 threadIdx
Definition: cudaCompat.h:29
callgraph.module
module
Definition: callgraph.py:61
gpuClustering::nClustersInModule
uint16_t *__restrict__ uint16_t const *__restrict__ uint32_t const *__restrict__ uint32_t *__restrict__ nClustersInModule
Definition: gpuClusterChargeCut.h:20
gpuClustering::endModule
auto endModule
Definition: gpuClusterChargeCut.h:32
phase1PixelTopology::layerStart
constexpr uint32_t layerStart[numberOfLayers+1]
Definition: phase1PixelTopology.h:26
gpuClustering::ok
__shared__ uint8_t ok[maxNumClustersPerModules]
Definition: gpuClusterChargeCut.h:28
gpuClustering::newclusId
__shared__ uint16_t newclusId[maxNumClustersPerModules]
Definition: gpuClusterChargeCut.h:29
cuda_assert.h
clusterChargeCut
float clusterChargeCut(const edm::ParameterSet &conf, const char *name="clusterChargeCut")
Definition: ClusterChargeCut.h:7
phase1PixelTopology.h
cms::cudacompat::blockIdx
const dim3 blockIdx
Definition: cudaCompat.h:32