11#include " CAHitNtupletGeneratorKernelsImpl.h"
2+ #include " CUDACore/ExecutionConfiguration.h"
23
34template <>
45void CAHitNtupletGeneratorKernelsGPU::fillHitDetIndices (HitsView const *hv, TkSoA *tracks_d, cudaStream_t cudaStream) {
5- auto blockSize = 128 ;
6+ cms::cuda::ExecutionConfiguration exec;
7+ auto blockSize = exec.configFromFile (" kernel_fillHitDetIndices" );
68 auto numberOfBlocks = (HitContainer::capacity () + blockSize - 1 ) / blockSize;
79
810 kernel_fillHitDetIndices<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
@@ -33,7 +35,8 @@ void CAHitNtupletGeneratorKernelsGPU::launchKernels(HitsOnCPU const &hh, TkSoA *
3335 // applying conbinatoric cleaning such as fishbone at this stage is too expensive
3436 //
3537
36- auto nthTot = 64 ;
38+ cms::cuda::ExecutionConfiguration exec;
39+ auto nthTot = exec.configFromFile (" kernel_connect" );
3740 auto stride = 4 ;
3841 auto blockSize = nthTot / stride;
3942 auto numberOfBlocks = (3 * m_params.maxNumberOfDoublets_ / 4 + blockSize - 1 ) / blockSize;
@@ -62,7 +65,7 @@ void CAHitNtupletGeneratorKernelsGPU::launchKernels(HitsOnCPU const &hh, TkSoA *
6265 cudaCheck (cudaGetLastError ());
6366
6467 if (nhits > 1 && m_params.earlyFishbone_ ) {
65- auto nthTot = 128 ;
68+ auto nthTot = exec. configFromFile ( " fishbone " ) ;
6669 auto stride = 16 ;
6770 auto blockSize = nthTot / stride;
6871 auto numberOfBlocks = (nhits + blockSize - 1 ) / blockSize;
@@ -73,7 +76,7 @@ void CAHitNtupletGeneratorKernelsGPU::launchKernels(HitsOnCPU const &hh, TkSoA *
7376 cudaCheck (cudaGetLastError ());
7477 }
7578
76- blockSize = 64 ;
79+ blockSize = exec. configFromFile ( " kernel_find_ntuplets " ) ;
7780 numberOfBlocks = (3 * m_params.maxNumberOfDoublets_ / 4 + blockSize - 1 ) / blockSize;
7881 kernel_find_ntuplets<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (hh.view (),
7982 device_theCells_.get (),
@@ -85,36 +88,41 @@ void CAHitNtupletGeneratorKernelsGPU::launchKernels(HitsOnCPU const &hh, TkSoA *
8588 m_params.minHitsPerNtuplet_ );
8689 cudaCheck (cudaGetLastError ());
8790
88- if (m_params.doStats_ )
91+ if (m_params.doStats_ ) {
92+ blockSize = exec.configFromFile (" kernel_mark_used" );
93+ numberOfBlocks = (3 * m_params.maxNumberOfDoublets_ / 4 + blockSize - 1 ) / blockSize;
8994 kernel_mark_used<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (hh.view (), device_theCells_.get (), device_nCells_);
90- cudaCheck (cudaGetLastError ());
91-
95+ cudaCheck (cudaGetLastError ());
96+ }
9297#ifdef GPU_DEBUG
9398 cudaDeviceSynchronize ();
9499 cudaCheck (cudaGetLastError ());
95100#endif
96101
97- blockSize = 128 ;
102+ blockSize = exec. configFromFile ( " finalizeBulk " ) ;
98103 numberOfBlocks = (HitContainer::totbins () + blockSize - 1 ) / blockSize;
99104 cms::cuda::finalizeBulk<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (device_hitTuple_apc_, tuples_d);
100105
101106 // remove duplicates (tracks that share a doublet)
107+ blockSize = exec.configFromFile (" kernel_earlyDuplicateRemover" );
102108 numberOfBlocks = (3 * m_params.maxNumberOfDoublets_ / 4 + blockSize - 1 ) / blockSize;
103109 kernel_earlyDuplicateRemover<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
104110 device_theCells_.get (), device_nCells_, tuples_d, quality_d);
105111 cudaCheck (cudaGetLastError ());
106112
107- blockSize = 128 ;
113+ blockSize = exec. configFromFile ( " kernel_countMultiplicity " ) ;
108114 numberOfBlocks = (3 * CAConstants::maxTuples () / 4 + blockSize - 1 ) / blockSize;
109115 kernel_countMultiplicity<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
110116 tuples_d, quality_d, device_tupleMultiplicity_.get ());
111117 cms::cuda::launchFinalize (device_tupleMultiplicity_.get (), cudaStream);
118+ blockSize = exec.configFromFile (" kernel_fillMultiplicity" );
119+ numberOfBlocks = (3 * CAConstants::maxTuples () / 4 + blockSize - 1 ) / blockSize;
112120 kernel_fillMultiplicity<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
113121 tuples_d, quality_d, device_tupleMultiplicity_.get ());
114122 cudaCheck (cudaGetLastError ());
115123
116124 if (nhits > 1 && m_params.lateFishbone_ ) {
117- auto nthTot = 128 ;
125+ auto nthTot = exec. configFromFile ( " fishbone " ) ;
118126 auto stride = 16 ;
119127 auto blockSize = nthTot / stride;
120128 auto numberOfBlocks = (nhits + blockSize - 1 ) / blockSize;
@@ -126,6 +134,7 @@ void CAHitNtupletGeneratorKernelsGPU::launchKernels(HitsOnCPU const &hh, TkSoA *
126134 }
127135
128136 if (m_params.doStats_ ) {
137+ blockSize = exec.configFromFile (" kernel_checkOverflows" );
129138 numberOfBlocks = (std::max (nhits, m_params.maxNumberOfDoublets_ ) + blockSize - 1 ) / blockSize;
130139 kernel_checkOverflows<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (tuples_d,
131140 device_tupleMultiplicity_.get (),
@@ -151,6 +160,7 @@ void CAHitNtupletGeneratorKernelsGPU::launchKernels(HitsOnCPU const &hh, TkSoA *
151160
152161template <>
153162void CAHitNtupletGeneratorKernelsGPU::buildDoublets (HitsOnCPU const &hh, cudaStream_t stream) {
163+ cms::cuda::ExecutionConfiguration exec;
154164 auto nhits = hh.nHits ();
155165
156166#ifdef NTUPLE_DEBUG
@@ -176,7 +186,7 @@ void CAHitNtupletGeneratorKernelsGPU::buildDoublets(HitsOnCPU const &hh, cudaStr
176186 CAConstants::maxNumOfActiveDoublets () * sizeof (GPUCACell::CellNeighbors));
177187
178188 {
179- int threadsPerBlock = 128 ;
189+ int threadsPerBlock = exec. configFromFile ( " initDoublets " ) ;
180190 // at least one block!
181191 int blocks = (std::max (1U , nhits) + threadsPerBlock - 1 ) / threadsPerBlock;
182192 gpuPixelDoublets::initDoublets<<<blocks, threadsPerBlock, 0 , stream>>> (device_isOuterHitOfCell_.get (),
@@ -238,40 +248,46 @@ void CAHitNtupletGeneratorKernelsGPU::classifyTuples(HitsOnCPU const &hh, TkSoA
238248 auto const *tuples_d = &tracks_d->hitIndices ;
239249 auto *quality_d = (Quality *)(&tracks_d->m_quality );
240250
241- auto blockSize = 64 ;
242-
243251 // classify tracks based on kinematics
252+ cms::cuda::ExecutionConfiguration exec;
253+ auto blockSize = exec.configFromFile (" kernel_classifyTracks" );
244254 auto numberOfBlocks = (3 * CAConstants::maxNumberOfQuadruplets () / 4 + blockSize - 1 ) / blockSize;
245255 kernel_classifyTracks<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (tuples_d, tracks_d, m_params.cuts_ , quality_d);
246256 cudaCheck (cudaGetLastError ());
247257
248258 if (m_params.lateFishbone_ ) {
249259 // apply fishbone cleaning to good tracks
260+ blockSize = exec.configFromFile (" kernel_fishboneCleaner" );
250261 numberOfBlocks = (3 * m_params.maxNumberOfDoublets_ / 4 + blockSize - 1 ) / blockSize;
251262 kernel_fishboneCleaner<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
252263 device_theCells_.get (), device_nCells_, quality_d);
253264 cudaCheck (cudaGetLastError ());
254265 }
255266
256267 // remove duplicates (tracks that share a doublet)
268+ blockSize = exec.configFromFile (" kernel_fastDuplicateRemover" );
257269 numberOfBlocks = (3 * m_params.maxNumberOfDoublets_ / 4 + blockSize - 1 ) / blockSize;
258270 kernel_fastDuplicateRemover<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
259271 device_theCells_.get (), device_nCells_, tuples_d, tracks_d);
260272 cudaCheck (cudaGetLastError ());
261273
262274 if (m_params.minHitsPerNtuplet_ < 4 || m_params.doStats_ ) {
263275 // fill hit->track "map"
276+ blockSize = exec.configFromFile (" kernel_countHitInTracks" );
264277 numberOfBlocks = (3 * CAConstants::maxNumberOfQuadruplets () / 4 + blockSize - 1 ) / blockSize;
265278 kernel_countHitInTracks<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
266279 tuples_d, quality_d, device_hitToTuple_.get ());
267280 cudaCheck (cudaGetLastError ());
268281 cms::cuda::launchFinalize (device_hitToTuple_.get (), cudaStream);
269282 cudaCheck (cudaGetLastError ());
283+ blockSize = exec.configFromFile (" kernel_fillHitInTracks" );
284+ numberOfBlocks = (3 * CAConstants::maxNumberOfQuadruplets () / 4 + blockSize - 1 ) / blockSize;
270285 kernel_fillHitInTracks<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (tuples_d, quality_d, device_hitToTuple_.get ());
271286 cudaCheck (cudaGetLastError ());
272287 }
273288 if (m_params.minHitsPerNtuplet_ < 4 ) {
274289 // remove duplicates (tracks that share a hit)
290+ blockSize = exec.configFromFile (" kernel_tripletCleaner" );
275291 numberOfBlocks = (HitToTuple::capacity () + blockSize - 1 ) / blockSize;
276292 kernel_tripletCleaner<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (
277293 hh.view (), tuples_d, tracks_d, quality_d, device_hitToTuple_.get ());
@@ -280,6 +296,7 @@ void CAHitNtupletGeneratorKernelsGPU::classifyTuples(HitsOnCPU const &hh, TkSoA
280296
281297 if (m_params.doStats_ ) {
282298 // counters (add flag???)
299+ blockSize = 64 ;
283300 numberOfBlocks = (HitToTuple::capacity () + blockSize - 1 ) / blockSize;
284301 kernel_doStatsForHitInTracks<<<numberOfBlocks, blockSize, 0 , cudaStream>>> (device_hitToTuple_.get (), counters_);
285302 cudaCheck (cudaGetLastError ());
0 commit comments