Skip to content

Commit 8f2cdfc

Browse files
committed
Make ITS GPU running on PbPb in async
1 parent 3f69ee5 commit 8f2cdfc

7 files changed

Lines changed: 41 additions & 32 deletions

File tree

Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ class TimeFrameGPU : public TimeFrame
190190
void initialiseHybrid(const int, const TrackingParameters&, const int, IndexTableUtils* utils = nullptr, const TimeFrameGPUParameters* pars = nullptr);
191191
void initDevice(const int, IndexTableUtils*, const TrackingParameters& trkParam, const TimeFrameGPUParameters&, const int, const int);
192192
void initDeviceSAFitting();
193-
void loadTrackingFrameInfoDevice();
193+
void loadTrackingFrameInfoDevice(const int);
194194
void loadUnsortedClustersDevice();
195195
void loadClustersDevice();
196196
void loadTrackletsDevice();
@@ -199,7 +199,7 @@ class TimeFrameGPU : public TimeFrame
199199
void loadTrackSeedsChi2Device();
200200
void loadRoadsDevice();
201201
void loadTrackSeedsDevice(std::vector<CellSeed>&);
202-
void createTrackITSExtDevice(const std::vector<CellSeed>& seeds);
202+
void createTrackITSExtDevice(const std::vector<CellSeed>&);
203203
void createTrackITSExtDevice(); // deprecated
204204
void downloadTrackITSExtDevice();
205205
void initDeviceChunks(const int, const int);

Detectors/ITSMFT/ITS/tracking/GPU/cuda/TimeFrameGPU.cu

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ void TimeFrameGPU<nLayers>::allocMemAsync(void** ptr, size_t size, Stream* strPt
345345
if (extAllocator) {
346346
*ptr = mAllocator->allocate(size);
347347
} else {
348-
LOGP(debug, "Calling default CUDA allocator");
348+
LOGP(info, "Calling default CUDA allocator");
349349
checkGPUError(cudaMallocAsync(reinterpret_cast<void**>(ptr), size, strPtr->get()));
350350
}
351351
}
@@ -376,17 +376,11 @@ void TimeFrameGPU<nLayers>::registerHostMemory(const int maxLayers)
376376
template <int nLayers>
377377
void TimeFrameGPU<nLayers>::unregisterHostMemory(const int maxLayers)
378378
{
379-
if (!mHostRegistered) {
380-
return;
381-
}
382-
for (auto iLayer{0}; iLayer < maxLayers; ++iLayer) {
383-
checkGPUError(cudaHostUnregister(mClusters[iLayer].data()));
384-
checkGPUError(cudaHostUnregister(mNClustersPerROF[iLayer].data()));
385-
checkGPUError(cudaHostUnregister(mIndexTables[iLayer].data()));
379+
for (auto iLayer{0}; iLayer < nLayers; ++iLayer) {
380+
checkGPUError(cudaHostUnregister(mTrackingFrameInfo[iLayer].data()));
386381
}
387-
checkGPUError(cudaHostUnregister(mHostNTracklets.data()));
388-
checkGPUError(cudaHostUnregister(mHostNCells.data()));
389-
mHostRegistered = false;
382+
checkGPUError(cudaHostUnregister(mTrackingFrameInfoDevice.data()));
383+
mAllocator->deallocate();
390384
}
391385

392386
template <int nLayers>
@@ -525,17 +519,21 @@ void TimeFrameGPU<nLayers>::loadClustersDevice()
525519
}
526520

527521
template <int nLayers>
528-
void TimeFrameGPU<nLayers>::loadTrackingFrameInfoDevice()
522+
void TimeFrameGPU<nLayers>::loadTrackingFrameInfoDevice(const int iteration)
529523
{
530524
for (auto iLayer{0}; iLayer < nLayers; ++iLayer) {
531525
LOGP(debug, "gpu-transfer: loading {} tfinfo on layer {}, for {} MB.", mTrackingFrameInfo[iLayer].size(), iLayer, mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo) / MB);
532526
allocMemAsync(reinterpret_cast<void**>(&mTrackingFrameInfoDevice[iLayer]), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), nullptr, getExtAllocator());
533527
// Register and move data
534-
checkGPUError(cudaHostRegister(mTrackingFrameInfo[iLayer].data(), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), cudaHostRegisterPortable));
528+
if (!iteration) {
529+
checkGPUError(cudaHostRegister(mTrackingFrameInfo[iLayer].data(), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), cudaHostRegisterPortable));
530+
}
535531
checkGPUError(cudaMemcpyAsync(mTrackingFrameInfoDevice[iLayer], mTrackingFrameInfo[iLayer].data(), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
536532
}
537533
allocMemAsync(reinterpret_cast<void**>(&mTrackingFrameInfoDeviceArray), nLayers * sizeof(TrackingFrameInfo*), nullptr, getExtAllocator());
538-
checkGPUError(cudaHostRegister(mTrackingFrameInfoDevice.data(), nLayers * sizeof(TrackingFrameInfo*), cudaHostRegisterPortable));
534+
if (!iteration) {
535+
checkGPUError(cudaHostRegister(mTrackingFrameInfoDevice.data(), nLayers * sizeof(TrackingFrameInfo*), cudaHostRegisterPortable));
536+
}
539537
checkGPUError(cudaMemcpyAsync(mTrackingFrameInfoDeviceArray, mTrackingFrameInfoDevice.data(), nLayers * sizeof(TrackingFrameInfo*), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
540538
}
541539

@@ -573,7 +571,7 @@ template <int nLayers>
573571
void TimeFrameGPU<nLayers>::loadRoadsDevice()
574572
{
575573
LOGP(debug, "gpu-transfer: loading {} roads, for {} MB.", mRoads.size(), mRoads.size() * sizeof(Road<nLayers - 2>) / MB);
576-
allocMemAsync(reinterpret_cast<void**>(&mRoadsDevice), mRoads.size() * sizeof(Road<nLayers - 2>), &(mGpuStreams[0]), false);
574+
allocMemAsync(reinterpret_cast<void**>(&mRoadsDevice), mRoads.size() * sizeof(Road<nLayers - 2>), &(mGpuStreams[0]), getExtAllocator());
577575
checkGPUError(cudaHostRegister(mRoads.data(), mRoads.size() * sizeof(Road<nLayers - 2>), cudaHostRegisterPortable));
578576
checkGPUError(cudaMemcpyAsync(mRoadsDevice, mRoads.data(), mRoads.size() * sizeof(Road<nLayers - 2>), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
579577
}
@@ -582,7 +580,7 @@ template <int nLayers>
582580
void TimeFrameGPU<nLayers>::loadTrackSeedsDevice(std::vector<CellSeed>& seeds)
583581
{
584582
LOGP(debug, "gpu-transfer: loading {} track seeds, for {} MB.", seeds.size(), seeds.size() * sizeof(CellSeed) / MB);
585-
allocMemAsync(reinterpret_cast<void**>(&mTrackSeedsDevice), seeds.size() * sizeof(CellSeed), &(mGpuStreams[0]), false);
583+
allocMemAsync(reinterpret_cast<void**>(&mTrackSeedsDevice), seeds.size() * sizeof(CellSeed), &(mGpuStreams[0]), getExtAllocator());
586584
checkGPUError(cudaHostRegister(seeds.data(), seeds.size() * sizeof(CellSeed), cudaHostRegisterPortable));
587585
checkGPUError(cudaMemcpyAsync(mTrackSeedsDevice, seeds.data(), seeds.size() * sizeof(CellSeed), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
588586
}
@@ -592,8 +590,8 @@ void TimeFrameGPU<nLayers>::createTrackITSExtDevice(const std::vector<CellSeed>&
592590
{
593591
mTrackITSExt.clear();
594592
mTrackITSExt.resize(seeds.size());
595-
LOGP(debug, "gpu-allocation: reserving {} tracks, for {} MB.", seeds.size(), seeds.size() * sizeof(o2::its::TrackITSExt) / MB);
596-
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), seeds.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), false);
593+
LOGP(info, "gpu-allocation: reserving {} tracks, for {} MB.", seeds.size(), seeds.size() * sizeof(o2::its::TrackITSExt) / MB);
594+
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), seeds.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), getExtAllocator());
597595
checkGPUError(cudaMemsetAsync(mTrackITSExtDevice, 0, seeds.size() * sizeof(o2::its::TrackITSExt), mGpuStreams[0].get()));
598596
checkGPUError(cudaHostRegister(mTrackITSExt.data(), seeds.size() * sizeof(o2::its::TrackITSExt), cudaHostRegisterPortable));
599597
}
@@ -603,8 +601,8 @@ void TimeFrameGPU<nLayers>::createTrackITSExtDevice()
603601
{
604602
mTrackITSExt.clear();
605603
mTrackITSExt.resize(mRoads.size());
606-
LOGP(debug, "gpu-allocation: reserving {} tracks, for {} MB.", mRoads.size(), mRoads.size() * sizeof(o2::its::TrackITSExt) / MB);
607-
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), mRoads.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), false);
604+
LOGP(info, "gpu-allocation: reserving {} tracks, for {} MB.", mRoads.size(), mRoads.size() * sizeof(o2::its::TrackITSExt) / MB);
605+
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), mRoads.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), getExtAllocator());
608606
checkGPUError(cudaMemsetAsync(mTrackITSExtDevice, 0, mRoads.size() * sizeof(o2::its::TrackITSExt), mGpuStreams[0].get()));
609607
checkGPUError(cudaHostRegister(mTrackITSExt.data(), mRoads.size() * sizeof(o2::its::TrackITSExt), cudaHostRegisterPortable));
610608
}

Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -870,9 +870,7 @@ template <int nLayers>
870870
void TrackerTraitsGPU<nLayers>::initialiseTimeFrame(const int iteration)
871871
{
872872
mTimeFrameGPU->initialiseHybrid(iteration, mTrkParams[iteration], nLayers);
873-
mTimeFrameGPU->loadClustersDevice();
874-
mTimeFrameGPU->loadUnsortedClustersDevice();
875-
mTimeFrameGPU->loadTrackingFrameInfoDevice();
873+
mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration);
876874
}
877875

878876
template <int nLayers>
@@ -1165,14 +1163,12 @@ template <int nLayers>
11651163
void TrackerTraitsGPU<nLayers>::computeTrackletsHybrid(const int iteration)
11661164
{
11671165
TrackerTraits::computeLayerTracklets(iteration);
1168-
// mTimeFrameGPU->loadTrackletsDevice();
11691166
}
11701167
11711168
template <int nLayers>
11721169
void TrackerTraitsGPU<nLayers>::computeCellsHybrid(const int iteration)
11731170
{
11741171
TrackerTraits::computeLayerCells(iteration);
1175-
// mTimeFrameGPU->loadCellsDevice();
11761172
};
11771173
11781174
template <int nLayers>
@@ -1203,6 +1199,10 @@ void TrackerTraitsGPU<nLayers>::findRoadsHybrid(const int iteration)
12031199
}
12041200
trackSeeds.insert(trackSeeds.end(), updatedCellSeed.begin(), updatedCellSeed.end());
12051201
}
1202+
if (!trackSeeds.size()) {
1203+
LOGP(info, "No track seeds found, skipping track finding");
1204+
continue;
1205+
}
12061206
mTimeFrameGPU->createTrackITSExtDevice(trackSeeds);
12071207
mTimeFrameGPU->loadTrackSeedsDevice(trackSeeds);
12081208
@@ -1265,6 +1265,9 @@ void TrackerTraitsGPU<nLayers>::findRoadsHybrid(const int iteration)
12651265
mTimeFrame->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track);
12661266
}
12671267
}
1268+
if (iteration == 2) {
1269+
mTimeFrameGPU->unregisterHostMemory(0); // FIXME this needs to work also with sync
1270+
}
12681271
};
12691272
12701273
template <int nLayers>

Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
106106
double total{0.};
107107
mTraits->UpdateTrackingParameters(mTrkParams);
108108
for (int iteration = 0; iteration < (int)mTrkParams.size(); ++iteration) {
109+
LOGP(info, "Iteration {}", iteration);
109110
total += evaluateTask(&Tracker::initialiseTimeFrameHybrid, "Hybrid Timeframe initialisation", logger, iteration);
110111
total += evaluateTask(&Tracker::computeTrackletsHybrid, "Hybrid Tracklet finding", logger, iteration);
111112
logger(fmt::format("\t- Number of tracklets: {}", mTraits->getTFNumberOfTracklets()));
@@ -115,7 +116,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
115116
}
116117
float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / mTraits->getTFNumberOfClusters() : 0.f;
117118
if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
118-
error(fmt::format("Too many tracklets per cluster ({}), check the detector status and/or the selections.", trackletsPerCluster));
119+
error(fmt::format("Too many tracklets per cluster ({}), check the detector status and/or the selections. Current limit is {}", trackletsPerCluster, mTrkParams[iteration].TrackletsPerClusterLimit));
119120
break;
120121
}
121122

@@ -127,7 +128,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
127128
}
128129
float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / mTraits->getTFNumberOfClusters() : 0.f;
129130
if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
130-
error(fmt::format("Too many cells per cluster ({}), check the detector status and/or the selections.", cellsPerCluster));
131+
error(fmt::format("Too many cells per cluster ({}), check the detector status and/or the selections. Current limit is {}", cellsPerCluster, mTrkParams[iteration].CellsPerClusterLimit));
131132
break;
132133
}
133134
total += evaluateTask(&Tracker::findCellsNeighboursHybrid, "Hybrid Neighbour finding", logger, iteration);

GPU/GPUTracking/Base/GPUReconstruction.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ void* GPUReconstruction::AllocateUnmanagedMemory(size_t size, int type)
676676
char* retVal;
677677
GPUProcessor::computePointerWithAlignment(pool, retVal, size);
678678
if (pool > poolend) {
679-
GPUError("Insufficient unmanaged memory: missing %lu", (size_t)((char*)pool - (char*)poolend));
679+
GPUError("Insufficient unmanaged memory: missing %lu bytes", (size_t)((char*)pool - (char*)poolend));
680680
throw std::bad_alloc();
681681
}
682682
UpdateMaxMemoryUsed();

GPU/GPUTracking/Global/GPUChainITS.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ o2::its::TimeFrame* GPUChainITS::GetITSTimeframe()
9090
mFrameworkAllocator.reset(new o2::its::GPUFrameworkExternalAllocator);
9191
mFrameworkAllocator->setReconstructionFramework(rec());
9292
mITSTimeFrame->setExternalAllocator(mFrameworkAllocator.get());
93-
LOGP(debug, "GPUChainITS is giving me ps: {} prop: {}", (void*)processorsShadow(), (void*)processorsShadow()->calibObjects.o2Propagator);
93+
LOGP(info, "GPUChainITS is giving me ps: {} prop: {} allocator: {}", (void*)processorsShadow(), (void*)processorsShadow()->calibObjects.o2Propagator, (void*)mFrameworkAllocator.get());
9494
mITSTimeFrame->setDevicePropagator(processorsShadow()->calibObjects.o2Propagator);
9595
}
9696
#endif

GPU/Workflow/src/GPUWorkflowITS.cxx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ int GPURecoWorkflowSpec::runITSTracking(o2::framework::ProcessingContext& pc)
184184
pattIt = patterns.begin();
185185
std::vector<int> savedROF;
186186
auto logger = [&](std::string s) { LOG(info) << s; };
187+
auto fatalLogger = [&](std::string s) { LOG(fatal) << s; };
187188
auto errorLogger = [&](std::string s) { LOG(error) << s; };
188189

189190
o2::its::FastMultEst multEst; // mult estimator
@@ -252,7 +253,11 @@ int GPURecoWorkflowSpec::runITSTracking(o2::framework::ProcessingContext& pc)
252253

253254
mITSTimeFrame->setMultiplicityCutMask(processingMask);
254255
// Run CA tracker
255-
mITSTracker->clustersToTracksHybrid(logger, errorLogger);
256+
if (!mSpecConfig.itsTrackingMode) {
257+
mITSTracker->clustersToTracksHybrid(logger, errorLogger);
258+
} else {
259+
mITSTracker->clustersToTracksHybrid(logger, fatalLogger);
260+
}
256261
size_t totTracks{mITSTimeFrame->getNumberOfTracks()}, totClusIDs{mITSTimeFrame->getNumberOfUsedClusters()};
257262
allTracks.reserve(totTracks);
258263
allClusIdx.reserve(totClusIDs);
@@ -319,6 +324,8 @@ void GPURecoWorkflowSpec::initFunctionITS(InitContext& ic)
319324
for (auto& param : trackParams) {
320325
param.ZBins = 64;
321326
param.PhiBins = 32;
327+
param.CellsPerClusterLimit = 1.e3f;
328+
param.TrackletsPerClusterLimit = 1.e3f;
322329
}
323330
trackParams[1].TrackletMinPt = 0.2f;
324331
trackParams[1].CellDeltaTanLambdaSigma *= 2.;

0 commit comments

Comments
 (0)