Skip to content

Commit 11facf5

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

File tree

9 files changed

+18
-6
lines changed

9 files changed

+18
-6
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
@@ -62,6 +62,7 @@ struct GPUParam_t {
6262

6363
GPUTPCGMPolynomialField polynomialField; // Polynomial approx. of magnetic field for TPC GM
6464
const uint32_t* occupancyMap; // Ptr to TPC occupancy map
65+
uint32_t occupancyMapSize; // Size of occupancy map
6566
uint32_t occupancyTotal; // Total occupancy in the TPC (nCl / nHbf)
6667

6768
GPUParamSector SectorParam[GPUCA_NSECTORS];

GPU/GPUTracking/Base/GPUParam.inc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ GPUdi() float GPUParam::GetUnscaledMult(float time) const
214214
return 0.f;
215215
}
216216
const uint32_t bin = CAMath::Max(0.f, time / rec.tpc.occupancyMapTimeBins);
217+
if (bin >= occupancyMapSize) {
218+
return 0.f;
219+
}
217220
return occupancyMap[bin];
218221
}
219222

GPU/GPUTracking/Base/GPUReconstructionCPU.cxx

Lines changed: 5 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,8 +356,11 @@ 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;
361365
param().occupancyTotal = occupancyTotal;
362366
if (IsGPU()) {

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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ void GPUO2InterfaceUtils::paramUseExternalOccupancyMap(GPUParam* param, uint32_t
132132
param->occupancyTotal = *occupancymap;
133133
if (param->rec.tpc.occupancyMapTimeBins) {
134134
param->occupancyMap = occupancymap + 2;
135+
param->occupancyMapSize = GPUTPCClusterOccupancyMapBin::getNBins(*param);
135136
}
136137
}
137138
}

0 commit comments

Comments
 (0)