Skip to content

Commit aa721c1

Browse files
committed
GPU: Add experimental V5 TPC ZS with entropy-reduced DLBZS
1 parent 4b25ec9 commit aa721c1

4 files changed

Lines changed: 45 additions & 17 deletions

File tree

DataFormats/Detectors/TPC/include/DataFormatsTPC/ZeroSuppression.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ enum ZSVersion : unsigned char {
2929
ZSVersionRowBased10BitADC = 1,
3030
ZSVersionRowBased12BitADC = 2,
3131
ZSVersionLinkBasedWithMeta = 3,
32-
ZSVersionDenseLinkBased = 4
32+
ZSVersionDenseLinkBased = 4,
33+
ZSVersionDenseLinkBasedV2 = 5
3334
};
3435

3536
struct TPCZSHDR {

GPU/GPUTracking/Base/GPUReconstructionConvert.cxx

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,7 @@ struct zsEncoderDenseLinkBased : public zsEncoderLinkBased {
741741
std::vector<unsigned short> sequenceBufferADC;
742742

743743
constexpr static int RAWLNK = rdh_utils::DLBZSLinkID;
744+
constexpr static int v2nbits = 10;
744745
};
745746

746747
bool zsEncoderDenseLinkBased::checkInput(std::vector<o2::tpc::Digit>& tmpBuffer, unsigned int k)
@@ -756,6 +757,9 @@ unsigned int zsEncoderDenseLinkBased::encodeSequence(std::vector<o2::tpc::Digit>
756757
{
757758
if (sequenceBuffer.size() == 0) {
758759
unsigned short bc = (long)tmpBuffer[k].getTimeStamp() * LHCBCPERTIMEBIN - (long)hbf * o2::constants::lhc::LHCMaxBunches;
760+
if (zsVersion == ZSVersion::ZSVersionDenseLinkBasedV2) {
761+
bc &= 0xFFC;
762+
}
759763
sequenceBuffer.emplace_back(bc << 4);
760764
sequenceBuffer.emplace_back(bc >> 4);
761765
curTimeBin = tmpBuffer[k].getTimeStamp() - firstTimebinInPage;
@@ -799,10 +803,25 @@ bool zsEncoderDenseLinkBased::writeSubPage()
799803
{
800804
unsigned int offset = sequenceBuffer.size();
801805
if (sequenceBufferADC.size()) {
802-
sequenceBuffer.resize(offset + (sequenceBufferADC.size() * 3 + 1) / 2);
806+
bool need12bit = zsVersion != ZSVersion::ZSVersionDenseLinkBasedV2;
807+
unsigned int needNow = 0;
808+
if (zsVersion == ZSVersion::ZSVersionDenseLinkBasedV2) {
809+
for (unsigned int i = 0; i < sequenceBufferADC.size(); i++) {
810+
if (sequenceBufferADC[i] >= (1 << v2nbits)) {
811+
need12bit = true;
812+
break;
813+
}
814+
}
815+
}
816+
unsigned int encodeBitsBlock = encodeBits;
817+
if (!need12bit) {
818+
encodeBitsBlock = v2nbits;
819+
sequenceBuffer[0] |= 0x10;
820+
}
821+
sequenceBuffer.resize(offset + (sequenceBufferADC.size() * encodeBitsBlock + 7) / 8);
803822
unsigned int tmp = 0;
804823
unsigned int tmpIn = sequenceBufferADC.size();
805-
ZSstreamOut(sequenceBufferADC.data(), tmpIn, sequenceBuffer.data() + offset, tmp, encodeBits);
824+
ZSstreamOut(sequenceBufferADC.data(), tmpIn, sequenceBuffer.data() + offset, tmp, encodeBitsBlock);
806825
sequenceBufferADC.clear();
807826
}
808827

@@ -845,15 +864,14 @@ void zsEncoderDenseLinkBased::decodePage(std::vector<o2::tpc::Digit>& outputBuff
845864
}
846865
const TPCZSHDRV2* decHDR = reinterpret_cast<const TPCZSHDRV2*>(decPagePtr + o2::raw::RDHUtils::getMemorySize(*rdh) - sizeof(TPCZSHDRV2));
847866
decPagePtr += sizeof(o2::header::RAWDataHeader);
848-
if (decHDR->version != ZSVersion::ZSVersionDenseLinkBased) {
867+
if (decHDR->version < ZSVersion::ZSVersionDenseLinkBased || decHDR->version > ZSVersion::ZSVersionDenseLinkBasedV2) {
849868
throw std::runtime_error("invalid ZS version");
850869
}
851870
if (decHDR->magicWord != o2::tpc::zerosupp_link_based::CommonHeader::MagicWordLinkZSMetaHeader) {
852871
throw std::runtime_error("Magic word missing");
853872
}
854873
const unsigned char* payloadEnd = ((const unsigned char*)decPage) + o2::raw::RDHUtils::getMemorySize(*rdh) - sizeof(TPCZSHDRV2) - (decHDR->flags & TPCZSHDRV2::ZSFlags::TriggerWordPresent ? TPCZSHDRV2::TRIGGER_WORD_SIZE : 0);
855874
const float decodeBitsFactor = 1.f / (1 << (encodeBits - 10));
856-
unsigned int mask = (1 << encodeBits) - 1;
857875
int cruid = decHDR->cruID;
858876
unsigned int sector = cruid / 10;
859877
if (sector != iSector) {
@@ -889,6 +907,10 @@ void zsEncoderDenseLinkBased::decodePage(std::vector<o2::tpc::Digit>& outputBuff
889907
}
890908
unsigned char linkCount = *((const unsigned char*)decPagePtr) & 0x0F;
891909
unsigned short linkBC = (*((const unsigned short*)decPagePtr) & 0xFFF0) >> 4;
910+
bool v2Flag = decHDR->version == ZSVersion::ZSVersionDenseLinkBasedV2 && *((const unsigned char*)decPagePtr) & 0x10;
911+
if (decHDR->version == ZSVersion::ZSVersionDenseLinkBasedV2) {
912+
linkBC &= 0xFFC;
913+
}
892914
decPagePtr += sizeof(unsigned short);
893915
std::vector<int> links;
894916
std::vector<std::bitset<80>> bitmasks;
@@ -918,22 +940,24 @@ void zsEncoderDenseLinkBased::decodePage(std::vector<o2::tpc::Digit>& outputBuff
918940
}
919941

920942
const unsigned char* adcData = (const unsigned char*)decPagePtr;
921-
decPagePtr += (nTotalSamples * encodeBits + 7) / 8;
943+
int encodeBitsBlock = v2Flag ? v2nbits : encodeBits;
944+
decPagePtr += (nTotalSamples * encodeBitsBlock + 7) / 8;
922945

923946
if (linkBC < triggerBC) {
924947
continue;
925948
}
926949
int timeBin = (linkBC - triggerBC + (unsigned long)(o2::raw::RDHUtils::getHeartBeatOrbit(*rdh) - firstOrbit) * o2::constants::lhc::LHCMaxBunches) / LHCBCPERTIMEBIN;
927950

928951
std::vector<unsigned short> samples(nTotalSamples);
952+
unsigned int mask = (1 << encodeBitsBlock) - 1;
929953
unsigned int byte = 0, bits = 0, posXbits = 0;
930954
while (posXbits < nTotalSamples) {
931955
byte |= *(adcData++) << bits;
932956
bits += 8;
933-
while (bits >= encodeBits) {
957+
while (bits >= encodeBitsBlock && posXbits < nTotalSamples) {
934958
samples[posXbits++] = byte & mask;
935-
byte = byte >> encodeBits;
936-
bits -= encodeBits;
959+
byte = byte >> encodeBitsBlock;
960+
bits -= encodeBitsBlock;
937961
}
938962
}
939963
unsigned int samplePos = 0;
@@ -1234,7 +1258,7 @@ void GPUReconstructionConvert::RunZSEncoder(const S& in, std::unique_ptr<unsigne
12341258
size_t totalSize = 0;
12351259
size_t nErrors = 0;
12361260
// clang-format off
1237-
GPUCA_OPENMP(parallel for reduction(+ : totalPages) reduction(+ : nErrors))
1261+
GPUCA_OPENMP(parallel for reduction(+ : totalPages, nErrors, totalSize))
12381262
// clang-format on
12391263
for (unsigned int i = 0; i < NSLICES; i++) {
12401264
std::vector<o2::tpc::Digit> tmpBuffer;
@@ -1273,7 +1297,7 @@ void GPUReconstructionConvert::RunZSEncoder(const S& in, std::unique_ptr<unsigne
12731297
if (version == ZSVersion::ZSVersionLinkBasedWithMeta) {
12741298
zsEncoderRun<zsEncoderImprovedLinkBased> enc{{{{.iSector = i, .raw = raw, .ir = ir, .param = &param, .padding = padding}}}};
12751299
runZS(enc);
1276-
} else if (version == ZSVersion::ZSVersionDenseLinkBased) {
1300+
} else if (version >= ZSVersion::ZSVersionDenseLinkBased && version <= ZSVersionDenseLinkBasedV2) {
12771301
zsEncoderRun<zsEncoderDenseLinkBased> enc{{{{.iSector = i, .raw = raw, .ir = ir, .param = &param, .padding = padding}}}};
12781302
runZS(enc);
12791303
}
@@ -1298,7 +1322,10 @@ void GPUReconstructionConvert::RunZSEncoder(const S& in, std::unique_ptr<unsigne
12981322
}
12991323
if (nErrors) {
13001324
printf("ERROR: %lld INCORRECT SAMPLES DURING ZS ENCODING VERIFICATION!!!\n", (long long int)nErrors);
1325+
} else if (verify) {
1326+
printf("ENCODING VERIFICATION PASSED\n");
13011327
}
1328+
printf("TOTAL ENCODED SIZE: %lu\n", totalSize);
13021329
#endif
13031330
}
13041331

@@ -1380,7 +1407,7 @@ std::function<void(std::vector<o2::tpc::Digit>&, const void*, unsigned int)> GPU
13801407
return GetDecoder_internal<zsEncoderRow>(param, version);
13811408
} else if (version == ZSVersion::ZSVersionLinkBasedWithMeta) {
13821409
return GetDecoder_internal<zsEncoderImprovedLinkBased>(param, version);
1383-
} else if (version == ZSVersion::ZSVersionDenseLinkBased) {
1410+
} else if (version >= ZSVersion::ZSVersionDenseLinkBased && version <= ZSVersion::ZSVersionDenseLinkBasedV2) {
13841411
return GetDecoder_internal<zsEncoderDenseLinkBased>(param, version);
13851412
} else {
13861413
throw std::runtime_error("Invalid ZS version");

GPU/GPUTracking/Global/GPUChainTrackingClusterizer.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ std::pair<unsigned int, unsigned int> GPUChainTracking::TPCClusterizerDecodeZSCo
156156
endpointAdcSamples[j] += hdr->nADCsamples;
157157
unsigned int timeBin = (hdr->timeOffset + (o2::raw::RDHUtils::getHeartBeatOrbit(*rdh) - firstHBF) * o2::constants::lhc::LHCMaxBunches) / LHCBCPERTIMEBIN;
158158
unsigned int maxTimeBin = timeBin + hdr->nTimeBinSpan;
159-
if (mCFContext->zsVersion == ZSVersion::ZSVersionDenseLinkBased) {
159+
if (mCFContext->zsVersion >= ZSVersion::ZSVersionDenseLinkBased) {
160160
const TPCZSHDRV2* const hdr2 = (const TPCZSHDRV2*)hdr;
161161
if (hdr2->flags & TPCZSHDRV2::ZSFlags::nTimeBinSpanBit8) {
162162
maxTimeBin += 256;
@@ -166,7 +166,7 @@ std::pair<unsigned int, unsigned int> GPUChainTracking::TPCClusterizerDecodeZSCo
166166
mCFContext->tpcMaxTimeBin = maxTimeBin;
167167
}
168168
bool extendsInNextPage = false;
169-
if (mCFContext->zsVersion == ZSVersion::ZSVersionDenseLinkBased) {
169+
if (mCFContext->zsVersion >= ZSVersion::ZSVersionDenseLinkBased) {
170170
if (l + 1 < mIOPtrs.tpcZS->slice[iSlice].nZSPtr[j][k] && o2::raw::RDHUtils::getMemorySize(*rdh) == TPCZSHDR::TPC_ZS_PAGE_SIZE) {
171171
const o2::header::RAWDataHeader* nextrdh = (const o2::header::RAWDataHeader*)(page + TPCZSHDR::TPC_ZS_PAGE_SIZE);
172172
extendsInNextPage = o2::raw::RDHUtils::getHeartBeatOrbit(*nextrdh) == o2::raw::RDHUtils::getHeartBeatOrbit(*rdh) && o2::raw::RDHUtils::getMemorySize(*nextrdh) > sizeof(o2::header::RAWDataHeader);
@@ -185,7 +185,7 @@ std::pair<unsigned int, unsigned int> GPUChainTracking::TPCClusterizerDecodeZSCo
185185
fragmentExtends[ff] = false;
186186
}
187187
};
188-
if (mCFContext->zsVersion == ZSVersion::ZSVersionDenseLinkBased) {
188+
if (mCFContext->zsVersion >= ZSVersion::ZSVersionDenseLinkBased) {
189189
for (unsigned int ff = 0; ff < firstPossibleFragment; ff++) {
190190
handleExtends(ff);
191191
}
@@ -227,7 +227,7 @@ std::pair<unsigned int, unsigned int> GPUChainTracking::TPCClusterizerDecodeZSCo
227227
} else {
228228
handleExtends(f);
229229
if (timeBin < (unsigned int)fragments[f].first.last()) {
230-
if (mCFContext->zsVersion == ZSVersion::ZSVersionDenseLinkBased) {
230+
if (mCFContext->zsVersion >= ZSVersion::ZSVersionDenseLinkBased) {
231231
for (unsigned int ff = f + 1; ff < mCFContext->nFragments; ff++) {
232232
handleExtends(ff);
233233
}

GPU/GPUTracking/TPCClusterFinder/GPUTPCCFDecodeZS.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ GPUd() uint32_t GPUTPCCFDecodeZSDenseLink::DecodePage(GPUSharedMemory& smem, pro
593593
const auto* decHeader = Peek<TPCZSHDRV2>(page, raw::RDHUtils::getMemorySize(*rawDataHeader) - sizeof(TPCZSHDRV2));
594594
ConsumeHeader<header::RAWDataHeader>(page);
595595

596-
assert(decHeader->version == ZSVersionDenseLinkBased);
596+
assert(decHeader->version >= ZSVersionDenseLinkBased);
597597
assert(decHeader->magicWord == tpc::zerosupp_link_based::CommonHeader::MagicWordLinkZSMetaHeader);
598598

599599
unsigned short nSamplesWritten = 0;

0 commit comments

Comments
 (0)