Skip to content

Commit 7b690c1

Browse files
committed
GPU TPC: Provide local occupancy info to error estimation
1 parent 4dab8cf commit 7b690c1

8 files changed

Lines changed: 62 additions & 41 deletions

File tree

GPU/GPUTracking/Base/GPUParam.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ struct GPUParam_t {
6969
float ParamErrors[2][4][4]; // cluster error parameterization used during seeding and fit
7070
#else
7171
float ParamErrorsSeeding0[2][3][4]; // cluster error parameterization used during seeding
72-
float ParamS0Par[2][3][6]; // cluster error parameterization used during track fit
72+
float ParamS0Par[2][3][6]; // cluster error parameterization used during track fit
7373
#endif
7474
};
7575
} // namespace internal
@@ -98,13 +98,13 @@ struct GPUParam : public internal::GPUParam_t<GPUSettingsRec, GPUSettingsParam>
9898
return 0.174533f + par.dAlpha * iSlice;
9999
}
100100
GPUd() float GetClusterErrorSeeding(int yz, int type, float z, float angle2) const;
101-
GPUd() void GetClusterErrorsSeeding2(char sector, int row, float z, float sinPhi, float DzDs, float time, float avgCharge, float& ErrY2, float& ErrZ2) const;
101+
GPUd() void GetClusterErrorsSeeding2(char sector, int row, float z, float sinPhi, float DzDs, float time, float avgCharge, float& ErrY2, float& ErrZ2) const;
102102
GPUd() float GetSystematicClusterErrorIFC2(float x, float y, float z, bool sideC) const;
103103

104-
GPUd() float GetClusterError2(int yz, int type, float z, float angle2, float time, float avgCharge) const;
104+
GPUd() float GetClusterError2(int yz, int type, float z, float angle2, float scaledMult, float scaledAvgCharge) const;
105105
GPUd() void GetClusterErrors2(char sector, int row, float z, float sinPhi, float DzDs, float time, float avgCharge, float& ErrY2, float& ErrZ2) const;
106106
GPUd() void UpdateClusterError2ByState(short clusterState, float& ErrY2, float& ErrZ2) const;
107-
GPUd() float GetScaledMult(int iSlice, int iRow, float t) const;
107+
GPUd() float GetScaledMult(int iSlice, int iRow, float time) const;
108108

109109
GPUd() void Slice2Global(int iSlice, float x, float y, float z, float* X, float* Y, float* Z) const;
110110
GPUd() void Global2Slice(int iSlice, float x, float y, float z, float* X, float* Y, float* Z) const;

GPU/GPUTracking/Base/GPUParam.inc

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ GPUdi() void MEM_LG(GPUParam)::GetClusterErrorsSeeding2(char sector, int iRow, f
5353
}
5454

5555
MEM_CLASS_PRE()
56-
GPUdi() float MEM_LG(GPUParam)::GetClusterError2(int yz, int type, float z, float angle2, float time, float avgCharge) const
56+
GPUdi() float MEM_LG(GPUParam)::GetClusterError2(int yz, int type, float z, float angle2, float scaledMult, float scaledAvgCharge) const
5757
{
5858
MakeType(const float*) c = ParamErrors[yz][type];
59-
float v = c[0] + c[1] * angle2 + c[2] * z + c[3] * 0;
59+
float v = c[0] + c[1] * angle2 + c[2] * z + c[3] * scaledMult;
6060
v = CAMath::Abs(v);
6161
v *= yz ? rec.tpc.clusterError2CorrectionZ : rec.tpc.clusterError2CorrectionY;
6262
v += yz ? rec.tpc.clusterError2AdditionalZ : rec.tpc.clusterError2AdditionalY;
@@ -69,27 +69,26 @@ GPUdi() float MEM_LG(GPUParam)::GetSystematicClusterErrorIFC2(float x, float y,
6969
float sysErr = 0.f;
7070
const float kMaxExpArg = 9.f; // limit r-dumped error to this exp. argument
7171

72-
const float rIFC=83.5;
72+
const float rIFC = 83.5;
7373
const float r = CAMath::Sqrt(x * x + y * y);
74-
if (r-rIFC < rec.tpc.sysClusErrorMinDist) {
74+
if (r - rIFC < rec.tpc.sysClusErrorMinDist) {
7575
return rec.tpc.sysClusErrorMaskError;
7676
}
7777

78-
if (sideC && rec.tpc.sysClusErrorNormIFCCE)
79-
{
78+
if (sideC && rec.tpc.sysClusErrorNormIFCCE) {
8079
float dr = CAMath::Abs(x - 85.f);
8180
float argExpIFCCE = dr * rec.tpc.sysClusErrorSlopeIFCCE;
8281
float dz = CAMath::Abs((rec.tpc.sysClusErrorIFCCEZRegion - z) * rec.tpc.sysClusErrorslopeIFCCEZ);
8382
argExpIFCCE += 0.5f * dz * dz;
8483
if (argExpIFCCE < kMaxExpArg) {
85-
float tmp = rec.tpc.sysClusErrorNormIFCCE * CAMath::Exp(-argExpIFCCE);
86-
sysErr += tmp * tmp;
84+
float tmp = rec.tpc.sysClusErrorNormIFCCE * CAMath::Exp(-argExpIFCCE);
85+
sysErr += tmp * tmp;
8786
}
8887
}
8988

9089
if (rec.tpc.sysClusErrorNormIFC) {
9190
float argExpIFC = (r - rIFC) * rec.tpc.sysClusErrorSlopeIFC;
92-
if (argExpIFC<kMaxExpArg) {
91+
if (argExpIFC < kMaxExpArg) {
9392
float tmp = rec.tpc.sysClusErrorNormIFC * CAMath::Exp(-argExpIFC);
9493
sysErr += tmp * tmp;
9594
}
@@ -163,9 +162,9 @@ GPUdi() void MEM_LG(GPUParam)::GetClusterErrors2(char sector, int iRow, float z,
163162
float sec2 = 1.f / (1.f - s2);
164163
float angleY2 = s2 * sec2; // dy/dx
165164
float angleZ2 = DzDs * DzDs * sec2; // dz/dx
166-
167-
float mult = time >= 0.f ? GetScaledMult(sector, iRow, time) : 0.f;
168-
165+
166+
float mult = time >= 0.f ? GetScaledMult(sector, iRow, time) / tpcGeometry.Row2X(iRow) : 0.f;
167+
169168
ErrY2 = GetClusterError2(0, rowType, z, angleY2, mult, avgCharge);
170169
ErrZ2 = GetClusterError2(1, rowType, z, angleZ2, mult, avgCharge);
171170
}
@@ -192,13 +191,13 @@ GPUdi() void MEM_LG(GPUParam)::UpdateClusterError2ByState(short clusterState, fl
192191
}
193192

194193
MEM_CLASS_PRE()
195-
GPUdi() float MEM_LG(GPUParam)::GetScaledMult(int iSlice, int iRow, float t) const
194+
GPUdi() float MEM_LG(GPUParam)::GetScaledMult(int iSlice, int iRow, float time) const
196195
{
197196
#if !defined(__OPENCL__) || defined(__OPENCLCPP__)
198197
if (!occupancyMap) {
199198
return 0.f;
200199
}
201-
const unsigned int bin = CAMath::Max(0.f, t / rec.tpc.occupancyMapTimeBins);
200+
const unsigned int bin = CAMath::Max(0.f, time / rec.tpc.occupancyMapTimeBins);
202201
return occupancyMap[bin].bin[iSlice][iRow] * rec.tpc.clusterErrorOccupancyScaler;
203202
#else
204203
return 0.f;

GPU/GPUTracking/Base/GPUReconstructionCPU.cxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,3 +374,12 @@ unsigned int GPUReconstructionCPU::SetAndGetNestedLoopOmpFactor(bool condition,
374374
}
375375
return mNestedLoopOmpFactor;
376376
}
377+
378+
void GPUReconstructionCPU::UpdateParamOccupancyMap(const GPUTPCClusterOccupancyMapBin* mapHost, const GPUTPCClusterOccupancyMapBin* mapGPU, int stream)
379+
{
380+
param().occupancyMap = mapHost;
381+
if (IsGPU()) {
382+
const auto threadContext = GetThreadContext();
383+
WriteToConstantMemory((char*)&processors()->param.occupancyMap - (char*)processors(), &mapGPU, sizeof(mapGPU), stream);
384+
}
385+
}

GPU/GPUTracking/Base/GPUReconstructionCPU.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ class GPUReconstructionCPU : public GPUReconstructionKernels<GPUReconstructionCP
157157
void SetNestedLoopOmpFactor(unsigned int f) { mNestedLoopOmpFactor = f; }
158158
unsigned int SetAndGetNestedLoopOmpFactor(bool condition, unsigned int max);
159159

160+
void UpdateParamOccupancyMap(const GPUTPCClusterOccupancyMapBin* mapHost, const GPUTPCClusterOccupancyMapBin* mapGPU, int stream = -1);
161+
160162
protected:
161163
struct GPUProcessorProcessors : public GPUProcessor {
162164
GPUConstantMem* mProcessorsProc = nullptr;
@@ -192,7 +194,7 @@ class GPUReconstructionCPU : public GPUReconstructionKernels<GPUReconstructionCP
192194
size_t TransferMemoryResourceLinkToHost(short res, int stream = -1, deviceEvent ev = nullptr, deviceEvent* evList = nullptr, int nEvents = 1) { return TransferMemoryResourceToHost(&mMemoryResources[res], stream, ev, evList, nEvents); }
193195
virtual size_t GPUMemCpy(void* dst, const void* src, size_t size, int stream, int toGPU, deviceEvent ev = nullptr, deviceEvent* evList = nullptr, int nEvents = 1);
194196
virtual size_t GPUMemCpyAlways(bool onGpu, void* dst, const void* src, size_t size, int stream, int toGPU, deviceEvent ev = nullptr, deviceEvent* evList = nullptr, int nEvents = 1);
195-
size_t WriteToConstantMemory(size_t offset, const void* src, size_t size, int stream, deviceEvent ev) override;
197+
size_t WriteToConstantMemory(size_t offset, const void* src, size_t size, int stream = -1, deviceEvent ev = nullptr) override;
196198
virtual size_t TransferMemoryInternal(GPUMemoryResource* res, int stream, deviceEvent ev, deviceEvent* evList, int nEvents, bool toGPU, const void* src, void* dst);
197199

198200
int InitDevice() override;

GPU/GPUTracking/Global/GPUChainTrackingSliceTracker.cxx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,16 @@ int GPUChainTracking::RunTPCTrackingSlices_internal()
149149
AllocateRegisteredMemory(mInputsHost->mResourceOccupancyMap, mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::tpcOccupancyMap)]);
150150
ReleaseEvent(mEvents->init);
151151
auto* ptr = doGPU ? mInputsShadow->mTPCClusterOccupancyMap : mInputsHost->mTPCClusterOccupancyMap;
152-
runKernel<GPUMemClean16>(GetGridAutoStep(mRec->NStreams() - 1, RecoStep::TPCSliceTracking), krnlRunRangeNone, {}, ptr, GPUTPCClusterOccupancyMapBin::getTotalSize(param()));
153-
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fill>(GetGridBlk(GPUCA_NSLICES * GPUCA_ROW_COUNT, mRec->NStreams() - 1), krnlRunRangeNone, krnlEventNone, ptr);
154-
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fold>(GetGridBlk(GPUCA_NSLICES * GPUCA_ROW_COUNT, mRec->NStreams() - 1), krnlRunRangeNone, {&mEvents->init}, ptr);
152+
int streamOccMap = mRec->NStreams() - 1;
153+
runKernel<GPUMemClean16>(GetGridAutoStep(streamOccMap, RecoStep::TPCSliceTracking), krnlRunRangeNone, {}, ptr, GPUTPCClusterOccupancyMapBin::getTotalSize(param()));
154+
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fill>(GetGridBlk(GPUCA_NSLICES * GPUCA_ROW_COUNT, streamOccMap), krnlRunRangeNone, krnlEventNone, ptr);
155+
runKernel<GPUTPCCreateOccupancyMap, GPUTPCCreateOccupancyMap::fold>(GetGridBlk(GPUCA_NSLICES * GPUCA_ROW_COUNT, streamOccMap), krnlRunRangeNone, {&mEvents->init}, ptr);
155156
if (doGPU) {
156157
TransferMemoryResourceLinkToHost(RecoStep::TPCSliceTracking, mInputsHost->mResourceOccupancyMap);
157158
} else {
158159
TransferMemoryResourceLinkToGPU(RecoStep::TPCSliceTracking, mInputsHost->mResourceOccupancyMap);
159160
}
161+
mRec->UpdateParamOccupancyMap(mInputsHost->mTPCClusterOccupancyMap, mInputsShadow->mTPCClusterOccupancyMap, streamOccMap);
160162
}
161163

162164
int streamMap[NSLICES];

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.cxx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,8 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int iT
315315
tup.Fill((float)clusters[ihit].row, xx, yy, zz, clAlpha, mX, ImP0, ImP1, mP[2], mP[3], mP[4], ImC0, ImC2, mC[14]);
316316
}
317317
#endif
318-
retVal = prop.Update(yy, zz, clusters[ihit].row, param, clusterState, rejectChi2, &interpolation.hit[ihit], refit, clusters[ihit].slice, -1.f, 0.f GPUCA_DEBUG_STREAMER_CHECK(, iTrk)); // TODO: Use correct time, avgCharge
318+
float time = merger->Param().par.earlyTpcTransform ? -1.f : merger->GetConstantMem()->ioPtrs.clustersNative->clustersLinear[clusters[ihit].num].getTime();
319+
retVal = prop.Update(yy, zz, clusters[ihit].row, param, clusterState, rejectChi2, &interpolation.hit[ihit], refit, clusters[ihit].slice, time, 0.f GPUCA_DEBUG_STREAMER_CHECK(, iTrk)); // TODO: Use correct time, avgCharge
319320
GPUCA_DEBUG_STREAMER_CHECK(if (o2::utils::DebugStreamer::checkStream(o2::utils::StreamFlags::streamUpdateTrack, iTrk)) {
320321
o2::utils::DebugStreamer::instance()->getStreamer("debug_update_track", "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName("tree_update_track").data() << "iTrk=" << iTrk << "ihit=" << ihit << "yy=" << yy << "zz=" << zz << "cluster=" << clusters[ihit] << "track=" << this << "rejectChi2=" << rejectChi2 << "interpolationhit=" << interpolation.hit[ihit] << "refit=" << refit << "retVal=" << retVal << "\n";
321322
})
@@ -558,25 +559,25 @@ GPUd() void GPUTPCGMTrackParam::AttachClusters(const GPUTPCGMMerger* GPUrestrict
558559
int bin, ny, nz;
559560

560561
float err2Y, err2Z;
561-
Merger->Param().GetClusterErrors2(slice, iRow, Z, mP[2], mP[3], -1.f, 0.f, err2Y, err2Z); // TODO: Use correct time/avgCharge
562+
Merger->Param().GetClusterErrors2(slice, iRow, Z, mP[2], mP[3], -1.f, 0.f, err2Y, err2Z); // TODO: Use correct time/avgCharge
562563
const float sy2 = CAMath::Min(Merger->Param().rec.tpc.tubeMaxSize2, Merger->Param().rec.tpc.tubeChi2 * (err2Y + CAMath::Abs(mC[0]))); // Cov can be bogus when following circle
563564
const float sz2 = CAMath::Min(Merger->Param().rec.tpc.tubeMaxSize2, Merger->Param().rec.tpc.tubeChi2 * (err2Z + CAMath::Abs(mC[2]))); // In that case we should provide the track error externally
564565
const float tubeY = CAMath::Sqrt(sy2);
565566
const float tubeZ = CAMath::Sqrt(sz2);
566567
const float sy21 = 1.f / sy2;
567568
const float sz21 = 1.f / sz2;
568-
float nY, nZ;
569+
float uncorrectedY, uncorrectedZ;
569570
if (Merger->Param().par.earlyTpcTransform) {
570-
nY = Y;
571-
nZ = Z;
571+
uncorrectedY = Y;
572+
uncorrectedZ = Z;
572573
} else {
573-
Merger->GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(slice, iRow, Y, Z, nY, nZ);
574+
Merger->GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(slice, iRow, Y, Z, uncorrectedY, uncorrectedZ);
574575
}
575576

576-
if (CAMath::Abs(nY) > row.getTPCMaxY()) {
577+
if (CAMath::Abs(uncorrectedY) > row.getTPCMaxY()) {
577578
return;
578579
}
579-
row.Grid().GetBinArea(nY, nZ + zOffset, tubeY, tubeZ, bin, ny, nz);
580+
row.Grid().GetBinArea(uncorrectedY, uncorrectedZ + zOffset, tubeY, tubeZ, bin, ny, nz);
580581

581582
const int nBinsY = row.Grid().Ny();
582583
const int idOffset = tracker.Data().ClusterIdOffset();
@@ -601,8 +602,8 @@ GPUd() void GPUTPCGMTrackParam::AttachClusters(const GPUTPCGMMerger* GPUrestrict
601602
const cahit2 hh = CA_TEXTURE_FETCH(cahit2, gAliTexRefu2, hits, ih);
602603
const float y = y0 + hh.x * stepY;
603604
const float z = z0 + hh.y * stepZ;
604-
const float dy = y - nY;
605-
const float dz = z - nZ;
605+
const float dy = y - uncorrectedY;
606+
const float dz = z - uncorrectedZ;
606607
if (dy * dy * sy21 + dz * dz * sz21 <= CAMath::Sqrt(2.f)) {
607608
// CADEBUG(printf("Found Y %f Z %f\n", y, z));
608609
CAMath::AtomicMax(weight, myWeight);

GPU/GPUTracking/SliceTracker/GPUTPCCreateOccupancyMap.cxx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,26 @@ GPUdii() void GPUTPCCreateOccupancyMap::Thread<GPUTPCCreateOccupancyMap::fold>(i
4343
if (iSliceRow > GPUCA_ROW_COUNT * GPUCA_NSLICES) {
4444
return;
4545
}
46+
static constexpr unsigned int FOLD_BINS_BEEFORE_AFTER = 2;
47+
static constexpr unsigned int FOLD_BINS = FOLD_BINS_BEEFORE_AFTER * 2 + 1;
4648
const unsigned int iSlice = iSliceRow / GPUCA_ROW_COUNT;
4749
const unsigned int iRow = iSliceRow % GPUCA_ROW_COUNT;
4850
const unsigned int nBins = GPUTPCClusterOccupancyMapBin::getNBins(param);
49-
const unsigned int nFoldBins = CAMath::Min(5u, nBins);
50-
unsigned int sum = 0;
51-
for (unsigned int i = 0; i < nFoldBins; i++) {
52-
sum += map[i].bin[iSlice][iRow];
51+
if (nBins < FOLD_BINS) {
52+
return;
53+
}
54+
unsigned short lastVal[FOLD_BINS_BEEFORE_AFTER];
55+
unsigned int sum = (FOLD_BINS_BEEFORE_AFTER + 1) * map[0].bin[iSlice][iRow];
56+
for (unsigned int i = 0; i < FOLD_BINS_BEEFORE_AFTER; i++) {
57+
sum += map[i + 1].bin[iSlice][iRow];
58+
lastVal[i] = map[0].bin[iSlice][iRow];
5359
}
54-
unsigned short lastVal;
60+
unsigned int lastValIndex = 0;
5561
for (unsigned int i = 0; i < nBins; i++) {
56-
lastVal = map[i].bin[iSlice][iRow];
57-
map[i].bin[iSlice][iRow] = sum / nFoldBins;
58-
sum += map[CAMath::Min(i + nFoldBins, nBins - 1)].bin[iSlice][iRow] - lastVal;
62+
unsigned short useLastVal = lastVal[lastValIndex];
63+
lastVal[lastValIndex] = map[i].bin[iSlice][iRow];
64+
map[i].bin[iSlice][iRow] = sum / FOLD_BINS;
65+
sum += map[CAMath::Min(i + FOLD_BINS_BEEFORE_AFTER + 1, nBins - 1)].bin[iSlice][iRow] - useLastVal;
66+
lastValIndex = lastValIndex < FOLD_BINS_BEEFORE_AFTER - 1 ? lastValIndex + 1 : 0;
5967
}
6068
}

GPU/GPUTracking/SliceTracker/GPUTPCTrackletConstructor.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ GPUdic(2, 1) void GPUTPCTrackletConstructor::UpdateTracklet(int /*nBlocks*/, int
302302
#endif //! GPUCA_TEXTURE_FETCH_CONSTRUCTOR
303303
#if !defined(__OPENCL__) || defined(__OPENCLCPP__)
304304
tracker.GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(tracker.ISlice(), iRow, yUncorrected, zUncorrected, yUncorrected, zUncorrected);
305-
305+
306306
#endif
307307
calink best = CALINK_INVAL;
308308

0 commit comments

Comments
 (0)