Skip to content

Commit 804d27e

Browse files
Gabriele Cimadordavidrohr
authored andcommitted
GPU: TPC Decoding: add new class TPCClusterDecompressionCore to avoid code duplication for old and new decoding
1 parent 62d02b2 commit 804d27e

File tree

7 files changed

+245
-125
lines changed

7 files changed

+245
-125
lines changed

GPU/GPUTracking/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ set(HDRS_INSTALL
122122
DataCompression/GPUTPCClusterRejection.h
123123
DataCompression/GPUTPCCompressionKernels.inc
124124
DataCompression/TPCClusterDecompressor.inc
125+
DataCompression/TPCClusterDecompressionCore.inc
125126
DataTypes/GPUdEdxInfo.h
126127
DataTypes/GPUHostDataTypes.h
127128
DataTypes/GPUO2DataTypes.h

GPU/GPUTracking/DataCompression/GPUTPCDecompression.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class GPUTPCDecompression : public GPUProcessor
4343
friend class GPUTPCDecompressionKernels;
4444
friend class GPUTPCDecompressionUtilKernels;
4545
friend class GPUChainTracking;
46-
46+
friend class TPCClusterDecompressionCore;
4747
public:
4848
#ifndef GPUCA_GPUCODE
4949
void InitializeProcessor();

GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.cxx

Lines changed: 3 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "GPUConstantMem.h"
1818
#include "GPUTPCCompressionTrackModel.h"
1919
#include "GPUCommonAlgorithm.h"
20+
#include "TPCClusterDecompressionCore.inc"
2021

2122
using namespace GPUCA_NAMESPACE::gpu;
2223
using namespace o2::tpc;
@@ -32,101 +33,10 @@ GPUdii() void GPUTPCDecompressionKernels::Thread<GPUTPCDecompressionKernels::ste
3233

3334
for (int32_t i = trackStart + get_global_id(0); i < trackEnd; i += get_global_size(0)) {
3435
uint32_t offset = decompressor.mAttachedClustersOffsets[i];
35-
decompressTrack(cmprClusters, param, maxTime, i, offset, decompressor);
36+
TPCClusterDecompressionCore::decompressTrack(cmprClusters, param, maxTime, i, offset, decompressor);
3637
}
3738
}
3839

39-
template <typename... Args>
40-
GPUdii() void GPUTPCDecompressionKernels::decompressTrack(CompressedClusters& cmprClusters, const GPUParam& param, const uint32_t maxTime, const uint32_t trackIndex, uint32_t& clusterOffset, Args&... args)
41-
{
42-
float zOffset = 0;
43-
uint32_t slice = cmprClusters.sliceA[trackIndex];
44-
uint32_t row = cmprClusters.rowA[trackIndex];
45-
GPUTPCCompressionTrackModel track;
46-
uint32_t clusterIndex;
47-
for (clusterIndex = 0; clusterIndex < cmprClusters.nTrackClusters[trackIndex]; clusterIndex++) {
48-
uint32_t pad = 0, time = 0;
49-
if (clusterIndex != 0) {
50-
uint8_t tmpSlice = cmprClusters.sliceLegDiffA[clusterOffset - trackIndex - 1];
51-
bool changeLeg = (tmpSlice >= GPUCA_NSLICES);
52-
if (changeLeg) {
53-
tmpSlice -= GPUCA_NSLICES;
54-
}
55-
if (cmprClusters.nComppressionModes & GPUSettings::CompressionDifferences) {
56-
slice += tmpSlice;
57-
if (slice >= GPUCA_NSLICES) {
58-
slice -= GPUCA_NSLICES;
59-
}
60-
row += cmprClusters.rowDiffA[clusterOffset - trackIndex - 1];
61-
if (row >= GPUCA_ROW_COUNT) {
62-
row -= GPUCA_ROW_COUNT;
63-
}
64-
} else {
65-
slice = tmpSlice;
66-
row = cmprClusters.rowDiffA[clusterOffset - trackIndex - 1];
67-
}
68-
if (changeLeg && track.Mirror()) {
69-
break;
70-
}
71-
if (track.Propagate(param.tpcGeometry.Row2X(row), param.SliceParam[slice].Alpha)) {
72-
break;
73-
}
74-
uint32_t timeTmp = cmprClusters.timeResA[clusterOffset - trackIndex - 1];
75-
if (timeTmp & 800000) {
76-
timeTmp |= 0xFF000000;
77-
}
78-
time = timeTmp + ClusterNative::packTime(CAMath::Max(0.f, param.tpcGeometry.LinearZ2Time(slice, track.Z() + zOffset)));
79-
float tmpPad = CAMath::Max(0.f, CAMath::Min((float)param.tpcGeometry.NPads(GPUCA_ROW_COUNT - 1), param.tpcGeometry.LinearY2Pad(slice, row, track.Y())));
80-
pad = cmprClusters.padResA[clusterOffset - trackIndex - 1] + ClusterNative::packPad(tmpPad);
81-
time = time & 0xFFFFFF;
82-
pad = (uint16_t)pad;
83-
if (pad >= param.tpcGeometry.NPads(row) * ClusterNative::scalePadPacked) {
84-
if (pad >= 0xFFFF - 11968) { // Constant 11968 = (2^15 - MAX_PADS(138) * scalePadPacked(64)) / 2
85-
pad = 0;
86-
} else {
87-
pad = param.tpcGeometry.NPads(row) * ClusterNative::scalePadPacked - 1;
88-
}
89-
}
90-
if (param.continuousMaxTimeBin > 0 && time >= maxTime) {
91-
if (time >= 0xFFFFFF - 544768) { // Constant 544768 = (2^23 - LHCMAXBUNCHES(3564) * MAXORBITS(256) * scaleTimePacked(64) / BCPERTIMEBIN(8)) / 2)
92-
time = 0;
93-
} else {
94-
time = maxTime;
95-
}
96-
}
97-
} else {
98-
time = cmprClusters.timeA[trackIndex];
99-
pad = cmprClusters.padA[trackIndex];
100-
}
101-
const auto cluster = decompressTrackStore(cmprClusters, clusterOffset, slice, row, pad, time, args...);
102-
float y = param.tpcGeometry.LinearPad2Y(slice, row, cluster.getPad());
103-
float z = param.tpcGeometry.LinearTime2Z(slice, cluster.getTime());
104-
if (clusterIndex == 0) {
105-
zOffset = z;
106-
track.Init(param.tpcGeometry.Row2X(row), y, z - zOffset, param.SliceParam[slice].Alpha, cmprClusters.qPtA[trackIndex], param);
107-
}
108-
if (clusterIndex + 1 < cmprClusters.nTrackClusters[trackIndex] && track.Filter(y, z - zOffset, row)) {
109-
break;
110-
}
111-
clusterOffset++;
112-
}
113-
clusterOffset += cmprClusters.nTrackClusters[trackIndex] - clusterIndex;
114-
}
115-
116-
GPUdii() ClusterNative GPUTPCDecompressionKernels::decompressTrackStore(const CompressedClusters& cmprClusters, const uint32_t clusterOffset, uint32_t slice, uint32_t row, uint32_t pad, uint32_t time, GPUTPCDecompression& decompressor)
117-
{
118-
uint32_t tmpBufferIndex = computeLinearTmpBufferIndex(slice, row, decompressor.mMaxNativeClustersPerBuffer);
119-
uint32_t currentClusterIndex = CAMath::AtomicAdd(decompressor.mNativeClustersIndex + (slice * GPUCA_ROW_COUNT + row), 1u);
120-
const ClusterNative c(time, cmprClusters.flagsA[clusterOffset], pad, cmprClusters.sigmaTimeA[clusterOffset], cmprClusters.sigmaPadA[clusterOffset], cmprClusters.qMaxA[clusterOffset], cmprClusters.qTotA[clusterOffset]);
121-
if (currentClusterIndex < decompressor.mMaxNativeClustersPerBuffer) {
122-
decompressor.mTmpNativeClusters[tmpBufferIndex + currentClusterIndex] = c;
123-
} else {
124-
decompressor.raiseError(GPUErrors::ERROR_DECOMPRESSION_ATTACHED_CLUSTER_OVERFLOW, slice * 1000 + row, currentClusterIndex, decompressor.mMaxNativeClustersPerBuffer);
125-
CAMath::AtomicExch(decompressor.mNativeClustersIndex + (slice * GPUCA_ROW_COUNT + row), decompressor.mMaxNativeClustersPerBuffer);
126-
}
127-
return c;
128-
}
129-
13040
template <>
13141
GPUdii() void GPUTPCDecompressionKernels::Thread<GPUTPCDecompressionKernels::step1unattached>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& processors, int32_t sliceStart, int32_t nSlices)
13242
{
@@ -146,7 +56,7 @@ GPUdii() void GPUTPCDecompressionKernels::Thread<GPUTPCDecompressionKernels::ste
14656
}
14757
ClusterNative* clout = buffer + decompressor.mNativeClustersIndex[linearIndex];
14858
uint32_t end = offsets[linearIndex] + ((linearIndex >= decompressor.mInputGPU.nSliceRows) ? 0 : decompressor.mInputGPU.nSliceRowClusters[linearIndex]);
149-
decompressHits(cmprClusters, offsets[linearIndex], end, clout);
59+
TPCClusterDecompressionCore::decompressHits(cmprClusters, offsets[linearIndex], end, clout);
15060
if (processors.param.rec.tpc.clustersShiftTimebins != 0.f) {
15161
for (uint32_t k = 0; k < outputAccess->nClusters[iSlice][iRow]; k++) {
15262
auto& cl = buffer[k];
@@ -163,31 +73,6 @@ GPUdii() void GPUTPCDecompressionKernels::Thread<GPUTPCDecompressionKernels::ste
16373
}
16474
}
16575

166-
template <typename... Args>
167-
GPUdii() void GPUTPCDecompressionKernels::decompressHits(const CompressedClusters& cmprClusters, const uint32_t start, const uint32_t end, Args&... args)
168-
{
169-
uint32_t time = 0;
170-
uint16_t pad = 0;
171-
for (uint32_t k = start; k < end; k++) {
172-
if (cmprClusters.nComppressionModes & GPUSettings::CompressionDifferences) {
173-
uint32_t timeTmp = cmprClusters.timeDiffU[k];
174-
if (timeTmp & 800000) {
175-
timeTmp |= 0xFF000000;
176-
}
177-
time += timeTmp;
178-
pad += cmprClusters.padDiffU[k];
179-
} else {
180-
time = cmprClusters.timeDiffU[k];
181-
pad = cmprClusters.padDiffU[k];
182-
}
183-
decompressHitsStore(cmprClusters, k, time, pad, args...);
184-
}
185-
}
186-
187-
GPUdii() void GPUTPCDecompressionKernels::decompressHitsStore(const CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, ClusterNative*& clusterNativeBuffer){
188-
*(clusterNativeBuffer++) = ClusterNative(time, cmprClusters.flagsU[k], pad, cmprClusters.sigmaTimeU[k], cmprClusters.sigmaPadU[k], cmprClusters.qMaxU[k], cmprClusters.qTotU[k]);
189-
}
190-
19176
template <typename T>
19277
GPUdi() void GPUTPCDecompressionKernels::decompressorMemcpyBasic(T* GPUrestrict() dst, const T* GPUrestrict() src, uint32_t size)
19378
{

GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ class GPUTPCDecompressionKernels : public GPUKernelTemplate
4646
template <int32_t iKernel = defaultKernel, typename... Args>
4747
GPUd() static void Thread(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() processors, Args... args);
4848

49-
template <typename... Args>
49+
/*template <typename... Args>
5050
GPUd() static void decompressTrack(o2::tpc::CompressedClusters& cmprClusters, const GPUParam& param, const uint32_t maxTime, const uint32_t trackIndex, uint32_t& clusterOffset, Args&... args);
5151
GPUdi() static o2::tpc::ClusterNative decompressTrackStore(const o2::tpc::CompressedClusters& cmprClusters, const uint32_t clusterOffset, uint32_t slice, uint32_t row, uint32_t pad, uint32_t time, GPUTPCDecompression& decompressor);
5252
5353
template <typename... Args>
5454
GPUdi() static void decompressHits(const o2::tpc::CompressedClusters& cmprClusters, const uint32_t start, const uint32_t end, Args&... args);
55-
GPUdi() static void decompressHitsStore(const o2::tpc::CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, o2::tpc::ClusterNative*& clusterNativeBuffer);
55+
GPUdi() static void decompressHitsStore(const o2::tpc::CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, o2::tpc::ClusterNative*& clusterNativeBuffer);*/
5656

5757
GPUd() static uint32_t computeLinearTmpBufferIndex(uint32_t slice, uint32_t row, uint32_t maxClustersPerBuffer)
5858
{
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
// Copyright 2024-2025 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file TPCCLusterDecompressionCore.inc
13+
/// \author Gabriele Cimador
14+
15+
#ifndef TPCCLUSTERDECOMPRESSOR_INC
16+
#define TPCCLUSTERDECOMPRESSOR_INC
17+
18+
#include "GPUTPCDecompression.h"
19+
#include "GPUConstantMem.h"
20+
#include "GPUTPCCompressionTrackModel.h"
21+
#include "GPUCommonAlgorithm.h"
22+
#include "GPUO2DataTypes.h"
23+
24+
using namespace o2::tpc;
25+
26+
namespace GPUCA_NAMESPACE::gpu
27+
{
28+
29+
class TPCClusterDecompressionCore{
30+
public:
31+
32+
#ifndef GPUCA_GPUCODE
33+
GPUhi() static auto decompressTrackStore(const CompressedClusters& clustersCompressed, const uint32_t offset, uint32_t slice, uint32_t row, uint32_t pad, uint32_t time, std::function<void(const ClusterNative&, uint32_t)> func)
34+
{
35+
const auto cluster = ClusterNative(time, clustersCompressed.flagsA[offset], pad, clustersCompressed.sigmaTimeA[offset], clustersCompressed.sigmaPadA[offset], clustersCompressed.qMaxA[offset], clustersCompressed.qTotA[offset]);
36+
func(cluster, offset);
37+
return cluster;
38+
}
39+
40+
GPUhi() static const auto& decompressTrackStore(const CompressedClusters& clustersCompressed, const uint32_t offset, uint32_t slice, uint32_t row, uint32_t pad, uint32_t time, std::vector<ClusterNative>& clusterVector)
41+
{
42+
clusterVector.emplace_back(time, clustersCompressed.flagsA[offset], pad, clustersCompressed.sigmaTimeA[offset], clustersCompressed.sigmaPadA[offset], clustersCompressed.qMaxA[offset], clustersCompressed.qTotA[offset]);
43+
return clusterVector.back();
44+
}
45+
46+
GPUhi() static auto decompressTrackStore(const CompressedClusters& clustersCompressed, const uint32_t offset, uint32_t slice, uint32_t row, uint32_t pad, uint32_t time, std::vector<ClusterNative> (&clusters)[GPUCA_NSLICES][GPUCA_ROW_COUNT], std::atomic_flag (&locks)[GPUCA_NSLICES][GPUCA_ROW_COUNT])
47+
{
48+
std::vector<ClusterNative>& clusterVector = clusters[slice][row];
49+
auto& lock = locks[slice][row];
50+
while (lock.test_and_set(std::memory_order_acquire)) {
51+
}
52+
ClusterNative retVal = decompressTrackStore(clustersCompressed, offset, slice, row, pad, time, clusterVector);
53+
lock.clear(std::memory_order_release);
54+
return retVal;
55+
}
56+
#endif
57+
58+
GPUdii() static ClusterNative decompressTrackStore(const CompressedClusters& cmprClusters, const uint32_t clusterOffset, uint32_t slice, uint32_t row, uint32_t pad, uint32_t time, GPUTPCDecompression& decompressor)
59+
{
60+
uint32_t tmpBufferIndex = slice * (GPUCA_ROW_COUNT * decompressor.mMaxNativeClustersPerBuffer) + row * decompressor.mMaxNativeClustersPerBuffer;
61+
uint32_t currentClusterIndex = CAMath::AtomicAdd(decompressor.mNativeClustersIndex + (slice * GPUCA_ROW_COUNT + row), 1u);
62+
const ClusterNative c(time, cmprClusters.flagsA[clusterOffset], pad, cmprClusters.sigmaTimeA[clusterOffset], cmprClusters.sigmaPadA[clusterOffset], cmprClusters.qMaxA[clusterOffset], cmprClusters.qTotA[clusterOffset]);
63+
if (currentClusterIndex < decompressor.mMaxNativeClustersPerBuffer) {
64+
decompressor.mTmpNativeClusters[tmpBufferIndex + currentClusterIndex] = c;
65+
} else {
66+
decompressor.raiseError(GPUErrors::ERROR_DECOMPRESSION_ATTACHED_CLUSTER_OVERFLOW, slice * 1000 + row, currentClusterIndex, decompressor.mMaxNativeClustersPerBuffer);
67+
CAMath::AtomicExch(decompressor.mNativeClustersIndex + (slice * GPUCA_ROW_COUNT + row), decompressor.mMaxNativeClustersPerBuffer);
68+
}
69+
return c;
70+
}
71+
72+
template <typename... Args>
73+
GPUhdi() static void decompressTrack(const CompressedClusters& cmprClusters, const GPUParam& param, const uint32_t maxTime, const uint32_t trackIndex, uint32_t& clusterOffset, Args&... args)
74+
{
75+
float zOffset = 0;
76+
uint32_t slice = cmprClusters.sliceA[trackIndex];
77+
uint32_t row = cmprClusters.rowA[trackIndex];
78+
GPUTPCCompressionTrackModel track;
79+
uint32_t clusterIndex;
80+
for (clusterIndex = 0; clusterIndex < cmprClusters.nTrackClusters[trackIndex]; clusterIndex++) {
81+
uint32_t pad = 0, time = 0;
82+
if (clusterIndex != 0) {
83+
uint8_t tmpSlice = cmprClusters.sliceLegDiffA[clusterOffset - trackIndex - 1];
84+
bool changeLeg = (tmpSlice >= GPUCA_NSLICES);
85+
if (changeLeg) {
86+
tmpSlice -= GPUCA_NSLICES;
87+
}
88+
if (cmprClusters.nComppressionModes & GPUSettings::CompressionDifferences) {
89+
slice += tmpSlice;
90+
if (slice >= GPUCA_NSLICES) {
91+
slice -= GPUCA_NSLICES;
92+
}
93+
row += cmprClusters.rowDiffA[clusterOffset - trackIndex - 1];
94+
if (row >= GPUCA_ROW_COUNT) {
95+
row -= GPUCA_ROW_COUNT;
96+
}
97+
} else {
98+
slice = tmpSlice;
99+
row = cmprClusters.rowDiffA[clusterOffset - trackIndex - 1];
100+
}
101+
if (changeLeg && track.Mirror()) {
102+
break;
103+
}
104+
if (track.Propagate(param.tpcGeometry.Row2X(row), param.SliceParam[slice].Alpha)) {
105+
break;
106+
}
107+
uint32_t timeTmp = cmprClusters.timeResA[clusterOffset - trackIndex - 1];
108+
if (timeTmp & 800000) {
109+
timeTmp |= 0xFF000000;
110+
}
111+
time = timeTmp + ClusterNative::packTime(CAMath::Max(0.f, param.tpcGeometry.LinearZ2Time(slice, track.Z() + zOffset)));
112+
float tmpPad = CAMath::Max(0.f, CAMath::Min((float)param.tpcGeometry.NPads(GPUCA_ROW_COUNT - 1), param.tpcGeometry.LinearY2Pad(slice, row, track.Y())));
113+
pad = cmprClusters.padResA[clusterOffset - trackIndex - 1] + ClusterNative::packPad(tmpPad);
114+
time = time & 0xFFFFFF;
115+
pad = (uint16_t)pad;
116+
if (pad >= param.tpcGeometry.NPads(row) * ClusterNative::scalePadPacked) {
117+
if (pad >= 0xFFFF - 11968) { // Constant 11968 = (2^15 - MAX_PADS(138) * scalePadPacked(64)) / 2
118+
pad = 0;
119+
} else {
120+
pad = param.tpcGeometry.NPads(row) * ClusterNative::scalePadPacked - 1;
121+
}
122+
}
123+
if (param.continuousMaxTimeBin > 0 && time >= maxTime) {
124+
if (time >= 0xFFFFFF - 544768) { // Constant 544768 = (2^23 - LHCMAXBUNCHES(3564) * MAXORBITS(256) * scaleTimePacked(64) / BCPERTIMEBIN(8)) / 2)
125+
time = 0;
126+
} else {
127+
time = maxTime;
128+
}
129+
}
130+
} else {
131+
time = cmprClusters.timeA[trackIndex];
132+
pad = cmprClusters.padA[trackIndex];
133+
}
134+
const auto cluster = decompressTrackStore(cmprClusters, clusterOffset, slice, row, pad, time, args...);
135+
float y = param.tpcGeometry.LinearPad2Y(slice, row, cluster.getPad());
136+
float z = param.tpcGeometry.LinearTime2Z(slice, cluster.getTime());
137+
if (clusterIndex == 0) {
138+
zOffset = z;
139+
track.Init(param.tpcGeometry.Row2X(row), y, z - zOffset, param.SliceParam[slice].Alpha, cmprClusters.qPtA[trackIndex], param);
140+
}
141+
if (clusterIndex + 1 < cmprClusters.nTrackClusters[trackIndex] && track.Filter(y, z - zOffset, row)) {
142+
break;
143+
}
144+
clusterOffset++;
145+
}
146+
clusterOffset += cmprClusters.nTrackClusters[trackIndex] - clusterIndex;
147+
}
148+
149+
GPUhdi() static const auto& decompressHitsStore(const CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, ClusterNative*& clusterBuffer)
150+
{
151+
return ((*(clusterBuffer++) = ClusterNative(time, cmprClusters.flagsU[k], pad, cmprClusters.sigmaTimeU[k], cmprClusters.sigmaPadU[k], cmprClusters.qMaxU[k], cmprClusters.qTotU[k])));
152+
}
153+
154+
GPUhdi() static auto decompressHitsStore(const CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, std::function<void(const ClusterNative&, uint32_t)> func)
155+
{
156+
const auto cluster = ClusterNative(time, cmprClusters.flagsU[k], pad, cmprClusters.sigmaTimeU[k], cmprClusters.sigmaPadU[k], cmprClusters.qMaxU[k], cmprClusters.qTotU[k]);
157+
func(cluster, k);
158+
return cluster;
159+
}
160+
161+
template <typename... Args>
162+
GPUdii() static void decompressHits(const CompressedClusters& cmprClusters, const uint32_t start, const uint32_t end, Args&... args)
163+
{
164+
uint32_t time = 0;
165+
uint16_t pad = 0;
166+
for (uint32_t k = start; k < end; k++) {
167+
if (cmprClusters.nComppressionModes & GPUSettings::CompressionDifferences) {
168+
uint32_t timeTmp = cmprClusters.timeDiffU[k];
169+
if (timeTmp & 800000) {
170+
timeTmp |= 0xFF000000;
171+
}
172+
time += timeTmp;
173+
pad += cmprClusters.padDiffU[k];
174+
} else {
175+
time = cmprClusters.timeDiffU[k];
176+
pad = cmprClusters.padDiffU[k];
177+
}
178+
decompressHitsStore(cmprClusters, k, time, pad, args...);
179+
}
180+
}
181+
182+
};
183+
}
184+
185+
#endif

GPU/GPUTracking/DataCompression/TPCClusterDecompressor.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include <algorithm>
2121
#include <cstring>
2222
#include <atomic>
23-
#include "TPCClusterDecompressor.inc"
23+
#include "TPCClusterDecompressionCore.inc"
2424

2525
using namespace GPUCA_NAMESPACE::gpu;
2626
using namespace o2::tpc;
@@ -62,7 +62,7 @@ int32_t TPCClusterDecompressor::decompress(const CompressedClusters* clustersCom
6262
offset += clustersCompressed->nTrackClusters[lasti++];
6363
}
6464
lasti++;
65-
decompressTrack(clustersCompressed, param, maxTime, i, offset, clusters, locks);
65+
TPCClusterDecompressionCore::decompressTrack(*clustersCompressed, param, maxTime, i, offset, clusters, locks);
6666
}
6767
size_t nTotalClusters = clustersCompressed->nAttachedClusters + clustersCompressed->nUnattachedClusters;
6868
ClusterNative* clusterBuffer = allocator(nTotalClusters);
@@ -91,7 +91,7 @@ int32_t TPCClusterDecompressor::decompress(const CompressedClusters* clustersCom
9191
}
9292
ClusterNative* clout = buffer + clusters[i][j].size();
9393
uint32_t end = offsets[i][j] + ((i * GPUCA_ROW_COUNT + j >= clustersCompressed->nSliceRows) ? 0 : clustersCompressed->nSliceRowClusters[i * GPUCA_ROW_COUNT + j]);
94-
decompressHits(clustersCompressed, offsets[i][j], end, clout);
94+
TPCClusterDecompressionCore::decompressHits(*clustersCompressed, offsets[i][j], end, clout);
9595
if (param.rec.tpc.clustersShiftTimebins != 0.f) {
9696
for (uint32_t k = 0; k < clustersNative.nClusters[i][j]; k++) {
9797
auto& cl = buffer[k];

0 commit comments

Comments
 (0)