Skip to content

Commit 0ee893b

Browse files
committed
ITS: GPU: fix upc iteration
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 63f4eaa commit 0ee893b

3 files changed

Lines changed: 9 additions & 5 deletions

File tree

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,12 @@ void TimeFrameGPU<nLayers>::loadTrackingFrameInfoDevice(const int iteration)
251251
template <int nLayers>
252252
void TimeFrameGPU<nLayers>::loadMultiplicityCutMask(const int iteration)
253253
{
254-
if (!iteration) {
254+
if (!iteration || iteration == 3) { // we need to re-load the swapped mult-mask in upc iteration
255255
GPUTimer timer(mGpuStreams[0], "loading multiplicity cut mask");
256-
GPULog("gpu-transfer: loading multiplicity cut mask with {} elements, for {:.2f} MB.", this->mMultiplicityCutMask.size(), this->mMultiplicityCutMask.size() * sizeof(bool) / constants::MB);
257-
allocMemAsync(reinterpret_cast<void**>(&mMultMaskDevice), this->mMultiplicityCutMask.size() * sizeof(uint8_t), mGpuStreams[0], this->getExtAllocator());
256+
GPULog("gpu-transfer: iteration {} loading multiplicity cut mask with {} elements, for {:.2f} MB.", iteration, this->mMultiplicityCutMask.size(), this->mMultiplicityCutMask.size() * sizeof(bool) / constants::MB);
257+
if (!iteration) { // only allocate on first call
258+
allocMemAsync(reinterpret_cast<void**>(&mMultMaskDevice), this->mMultiplicityCutMask.size() * sizeof(uint8_t), mGpuStreams[0], this->getExtAllocator());
259+
}
258260
GPUChkErrS(cudaMemcpyAsync(mMultMaskDevice, this->mMultiplicityCutMask.data(), this->mMultiplicityCutMask.size() * sizeof(uint8_t), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
259261
}
260262
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,9 +544,10 @@ GPUg() void computeLayerTrackletsMultiROFKernel(
544544
const float inverseR0{1.f / currentCluster.radius};
545545
for (int iV{startVtx}; iV < endVtx; ++iV) {
546546
auto& primaryVertex{primaryVertices[iV]};
547-
if (primaryVertex.isFlagSet(Vertex::Flags::UPCMode) && iteration != 3) {
547+
if ((primaryVertex.isFlagSet(Vertex::Flags::UPCMode) && iteration != 3) || (iteration == 3 && !primaryVertex.isFlagSet(Vertex::Flags::UPCMode))) {
548548
continue;
549549
}
550+
550551
const float resolution = o2::gpu::CAMath::Sqrt(math_utils::Sq(resolutionPV) / primaryVertex.getNContributors() + math_utils::Sq(positionResolution));
551552
const float tanLambda{(currentCluster.zCoordinate - primaryVertex.getZ()) * inverseR0};
552553
const float zAtRmin{tanLambda * (minR - currentCluster.radius) + currentCluster.zCoordinate};

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,10 @@ void TrackerTraits<nLayers>::computeLayerTracklets(const int iteration, int iROF
107107

108108
for (int iV = startVtx; iV < endVtx; ++iV) {
109109
const auto& pv = primaryVertices[iV];
110-
if (pv.isFlagSet(Vertex::Flags::UPCMode) && iteration != 3) {
110+
if ((pv.isFlagSet(Vertex::Flags::UPCMode) && iteration != 3) || (iteration == 3 && !pv.isFlagSet(Vertex::Flags::UPCMode))) {
111111
continue;
112112
}
113+
113114
const float resolution = o2::gpu::CAMath::Sqrt(math_utils::Sq(mTimeFrame->getPositionResolution(iLayer)) + math_utils::Sq(mTrkParams[iteration].PVres) / float(pv.getNContributors()));
114115
const float tanLambda = (currentCluster.zCoordinate - pv.getZ()) * inverseR0;
115116
const float zAtRmin = tanLambda * (mTimeFrame->getMinR(iLayer + 1) - currentCluster.radius) + currentCluster.zCoordinate;

0 commit comments

Comments
 (0)