Skip to content

Commit ade1ab3

Browse files
committed
GPU TPC: occuapncy Map needs bounds check
1 parent 2c2f420 commit ade1ab3

File tree

10 files changed

+19
-8
lines changed

10 files changed

+19
-8
lines changed

GPU/GPUTracking/Base/GPUParam.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void GPUParam::SetDefaults(float solenoidBz, bool assumeConstantBz)
3535
memset((void*)this, 0, sizeof(*this));
3636
new (&rec) GPUSettingsRec;
3737
occupancyMap = nullptr;
38+
occupancyMap = 0;
3839
occupancyTotal = 0;
3940

4041
#ifdef GPUCA_TPC_GEOMETRY_O2

GPU/GPUTracking/Base/GPUParam.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ struct GPUParam_t {
6363
GPUTPCGMPolynomialField polynomialField; // Polynomial approx. of magnetic field for TPC GM
6464
const uint32_t* occupancyMap; // Ptr to TPC occupancy map
6565
uint32_t occupancyTotal; // Total occupancy in the TPC (nCl / nHbf)
66+
uint32_t occupancyMapSize; // Size of occupancy map
6667

6768
GPUParamSector SectorParam[GPUCA_NSECTORS];
6869

GPU/GPUTracking/Base/GPUParam.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ GPUdi() float GPUParam::GetUnscaledMult(float time) const
213213
if (!occupancyMap) {
214214
return 0.f;
215215
}
216-
const uint32_t bin = CAMath::Max(0.f, time / rec.tpc.occupancyMapTimeBins);
216+
const uint32_t bin = CAMath::Min<uint32_t>(occupancyMapSize - 1, CAMath::Max(0.f, time / rec.tpc.occupancyMapTimeBins));
217217
return occupancyMap[bin];
218218
}
219219

GPU/GPUTracking/Base/GPUReconstructionCPU.cxx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "GPULogging.h"
3232
#include "GPUMemorySizeScalers.h"
3333
#include "GPUReconstructionProcessingKernels.inc"
34+
#include "GPUTPCClusterOccupancyMap.h"
3435

3536
#include <atomic>
3637
#include <ctime>
@@ -355,9 +356,13 @@ void GPUReconstructionCPU::ResetDeviceProcessorTypes()
355356
}
356357
}
357358

358-
void GPUReconstructionCPU::UpdateParamOccupancyMap(const uint32_t* mapHost, const uint32_t* mapGPU, uint32_t occupancyTotal, int32_t stream)
359+
void GPUReconstructionCPU::UpdateParamOccupancyMap(const uint32_t* mapHost, const uint32_t* mapGPU, uint32_t occupancyTotal, uint32_t mapSize, int32_t stream)
359360
{
361+
if (mapHost && mapSize != GPUTPCClusterOccupancyMapBin::getNBins(param())) {
362+
throw std::runtime_error("Updating occupancy map with object of invalid size");
363+
}
360364
param().occupancyMap = mapHost;
365+
param().occupancyMapSize = mapSize;
361366
param().occupancyTotal = occupancyTotal;
362367
if (IsGPU()) {
363368
if (!((size_t)&param().occupancyTotal - (size_t)&param().occupancyMap == sizeof(param().occupancyMap) && sizeof(param().occupancyMap) == sizeof(size_t) && sizeof(param().occupancyTotal) < sizeof(size_t))) {

GPU/GPUTracking/Base/GPUReconstructionCPU.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class GPUReconstructionCPU : public GPUReconstructionProcessing::KernelInterface
4848

4949
int32_t RunChains() override;
5050

51-
void UpdateParamOccupancyMap(const uint32_t* mapHost, const uint32_t* mapGPU, uint32_t occupancyTotal, int32_t stream = -1);
51+
void UpdateParamOccupancyMap(const uint32_t* mapHost, const uint32_t* mapGPU, uint32_t occupancyTotal, uint32_t mapSize, int32_t stream = -1);
5252

5353
protected:
5454
struct GPUProcessorProcessors : public GPUProcessor {

GPU/GPUTracking/Global/GPUChainTrackingSectorTracker.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,19 @@ int32_t GPUChainTracking::RunTPCTrackingSectors_internal()
126126
auto* ptrTmp = (GPUTPCClusterOccupancyMapBin*)mRec->AllocateVolatileMemory(GPUTPCClusterOccupancyMapBin::getTotalSize(param()), doGPU);
127127
runKernel<GPUMemClean16>(GetGridAutoStep(streamInitAndOccMap, RecoStep::TPCSectorTracking), ptrTmp, GPUTPCClusterOccupancyMapBin::getTotalSize(param()));
128128
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fill>(GetGridBlk(GPUCA_NSECTORS * GPUCA_ROW_COUNT, streamInitAndOccMap), ptrTmp);
129-
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fold>(GetGridBlk(GPUTPCClusterOccupancyMapBin::getNBins(param()), streamInitAndOccMap), ptrTmp, ptr + 2);
129+
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fold>(GetGridBlk(mInputsHost->mTPCClusterOccupancyMapSize, streamInitAndOccMap), ptrTmp, ptr + 2);
130130
mRec->ReturnVolatileMemory();
131131
mInputsHost->mTPCClusterOccupancyMap[1] = param().rec.tpc.occupancyMapTimeBins * 0x10000 + param().rec.tpc.occupancyMapTimeBinsAverage;
132132
if (doGPU) {
133-
GPUMemCpy(RecoStep::TPCSectorTracking, mInputsHost->mTPCClusterOccupancyMap + 2, mInputsShadow->mTPCClusterOccupancyMap + 2, sizeof(*ptr) * GPUTPCClusterOccupancyMapBin::getNBins(mRec->GetParam()), streamInitAndOccMap, false, &mEvents->init);
133+
GPUMemCpy(RecoStep::TPCSectorTracking, mInputsHost->mTPCClusterOccupancyMap + 2, mInputsShadow->mTPCClusterOccupancyMap + 2, sizeof(*ptr) * mInputsHost->mTPCClusterOccupancyMapSize, streamInitAndOccMap, false, &mEvents->init);
134134
} else {
135135
TransferMemoryResourceLinkToGPU(RecoStep::TPCSectorTracking, mInputsHost->mResourceOccupancyMap, streamInitAndOccMap, &mEvents->init);
136136
}
137137
}
138138
if (param().rec.tpc.occupancyMapTimeBins || param().rec.tpc.sysClusErrorC12Norm) {
139139
uint32_t& occupancyTotal = *mInputsHost->mTPCClusterOccupancyMap;
140140
occupancyTotal = CAMath::Float2UIntRn(mRec->MemoryScalers()->nTPCHits / (mIOPtrs.settingsTF && mIOPtrs.settingsTF->hasNHBFPerTF ? mIOPtrs.settingsTF->nHBFPerTF : 128));
141-
mRec->UpdateParamOccupancyMap(param().rec.tpc.occupancyMapTimeBins ? mInputsHost->mTPCClusterOccupancyMap + 2 : nullptr, doGPU && param().rec.tpc.occupancyMapTimeBins ? mInputsShadow->mTPCClusterOccupancyMap + 2 : nullptr, occupancyTotal, streamInitAndOccMap);
141+
mRec->UpdateParamOccupancyMap(param().rec.tpc.occupancyMapTimeBins ? mInputsHost->mTPCClusterOccupancyMap + 2 : nullptr, doGPU && param().rec.tpc.occupancyMapTimeBins ? mInputsShadow->mTPCClusterOccupancyMap + 2 : nullptr, occupancyTotal, mInputsHost->mTPCClusterOccupancyMapSize, streamInitAndOccMap);
142142
}
143143

144144
int32_t streamMap[NSECTORS];

GPU/GPUTracking/Global/GPUTrackingInputProvider.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ void* GPUTrackingInputProvider::SetPointersInputTRD(void* mem)
8282
void* GPUTrackingInputProvider::SetPointersTPCOccupancyMap(void* mem)
8383
{
8484
if (mHoldTPCOccupancyMap) {
85-
computePointerWithAlignment(mem, mTPCClusterOccupancyMap, (mRec->GetParam().rec.tpc.occupancyMapTimeBins ? GPUTPCClusterOccupancyMapBin::getNBins(mRec->GetParam()) + 1 : 0) + 1); // +1 for total occupancy estimator, +1 for sanity check information
85+
mTPCClusterOccupancyMapSize = mRec->GetParam().rec.tpc.occupancyMapTimeBins ? GPUTPCClusterOccupancyMapBin::getNBins(mRec->GetParam()) : 0;
86+
computePointerWithAlignment(mem, mTPCClusterOccupancyMap, (mRec->GetParam().rec.tpc.occupancyMapTimeBins ? mTPCClusterOccupancyMapSize + 1 : 0) + 1); // +1 for total occupancy estimator, +1 for sanity check information
8687
}
8788
return mem;
8889
}

GPU/GPUTracking/Global/GPUTrackingInputProvider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class GPUTrackingInputProvider : public GPUProcessor
8181
o2::tpc::ClusterNative* mPclusterNativeOutput = nullptr;
8282

8383
uint32_t* mTPCClusterOccupancyMap = nullptr;
84+
uint32_t mTPCClusterOccupancyMapSize = 0;
8485

8586
uint32_t* mErrorCodes = nullptr;
8687
};

GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "TPCBase/CRU.h"
2727
#include "TPCBase/RDHUtils.h"
2828
#include "DataFormatsTPC/ZeroSuppression.h"
29+
#include "GPUTPCClusterOccupancyMap.h"
2930
#include <gsl/span>
3031

3132
using namespace o2::gpu;
@@ -132,6 +133,7 @@ void GPUO2InterfaceUtils::paramUseExternalOccupancyMap(GPUParam* param, uint32_t
132133
param->occupancyTotal = *occupancymap;
133134
if (param->rec.tpc.occupancyMapTimeBins) {
134135
param->occupancyMap = occupancymap + 2;
136+
param->occupancyMapSize = GPUTPCClusterOccupancyMapBin::getNBins(*param);
135137
}
136138
}
137139
}

GPU/GPUTracking/Standalone/Benchmark/standalone.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ int32_t SetupReconstruction()
453453
if (configStandalone.proc.doublePipeline) {
454454
recPipeline->SetSettings(&grp, &recSet, &procSet, &steps);
455455
}
456-
if (configStandalone.testSyncAsync) {
456+
if (configStandalone.testSyncAsync) { // TODO: Add --async mode / flag
457457
// Set settings for asynchronous
458458
steps.steps.setBits(GPUDataTypes::RecoStep::TPCDecompression, true);
459459
steps.steps.setBits(GPUDataTypes::RecoStep::TPCdEdx, true);

0 commit comments

Comments
 (0)