31 const CfFragment& fragment = clusterer.mPmemory->fragment;
34 int32_t basePad = iBlock * PadsPerCacheline;
35 CfChargePos basePos = padToCfChargePos(basePad, clusterer);
37 if (not basePos.valid()) {
44 int32_t totalCharges = 0;
45 int32_t consecCharges = 0;
46 int32_t maxConsecCharges = 0;
49 int16_t localPadId = iThread / NumOfCachedTimebins;
50 int16_t localTimeBin = iThread % NumOfCachedTimebins;
51 bool handlePad = localTimeBin == 0;
53 for (
tpccf::TPCFragmentTime t = fragment.firstNonOverlapTimeBin(); t < fragment.lastNonOverlapTimeBin(); t += NumOfCachedTimebins) {
54 const CfChargePos pos = basePos.delta({localPadId, int16_t(t + localTimeBin)});
55 smem.charges[localPadId][localTimeBin] = (
pos.valid()) ? chargeMap[
pos].unpack() : 0;
58 for (int32_t
i = 0;
i < NumOfCachedTimebins;
i++) {
59 const Charge q = smem.charges[localPadId][
i];
60 totalCharges += (q > 0);
61 consecCharges = (q > 0) ? consecCharges + 1 : 0;
62 maxConsecCharges = CAMath::Max(consecCharges, maxConsecCharges);
63 maxCharge = CAMath::Max<Charge>(q, maxCharge);
72 updatePadBaseline(basePad + localPadId, clusterer, totalCharges, maxConsecCharges, maxCharge);
77 constexpr size_t ElemsInTileRow = (size_t)
TilingLayout<
GridSize<2>>::WidthInTiles * TimebinsPerCacheline * PadsPerCacheline;
79 using UShort8 = Vc::fixed_size_simd<uint16_t, PadsPerCacheline>;
80 using Charge8 = Vc::fixed_size_simd<float, PadsPerCacheline>;
82 UShort8 totalCharges{Vc::Zero};
83 UShort8 consecCharges{Vc::Zero};
84 UShort8 maxConsecCharges{Vc::Zero};
85 Charge8 maxCharge{Vc::Zero};
90 const uint16_t* packedChargeStart =
reinterpret_cast<uint16_t*
>(&chargeMap[basePos.delta({0, t})]);
92 for (; t < fragment.lastNonOverlapTimeBin(); t += TimebinsPerCacheline) {
94 const UShort8 packedCharges{packedChargeStart + PadsPerCacheline * localtime, Vc::Aligned};
95 const UShort8::mask_type isCharge = packedCharges != 0;
97 if (isCharge.isNotEmpty()) {
98 totalCharges(isCharge)++;
100 consecCharges(not isCharge) = 0;
101 maxConsecCharges = Vc::max(consecCharges, maxConsecCharges);
110 maxCharge = Vc::max(maxCharge, unpackedCharges);
116 packedChargeStart += ElemsInTileRow;
119 for (
tpccf::Pad localpad = 0; localpad < PadsPerCacheline; localpad++) {
120 updatePadBaseline(basePad + localpad, clusterer, totalCharges[localpad], maxConsecCharges[localpad], maxCharge[localpad]);