34 const CfFragment& fragment = clusterer.mPmemory->fragment;
37 int32_t basePad = iBlock * PadsPerCacheline;
38 ChargePos basePos = padToChargePos(basePad, clusterer);
40 if (not basePos.valid()) {
47 int32_t totalCharges = 0;
48 int32_t consecCharges = 0;
49 int32_t maxConsecCharges = 0;
52 int16_t localPadId = iThread / NumOfCachedTimebins;
53 int16_t localTimeBin = iThread % NumOfCachedTimebins;
54 bool handlePad = localTimeBin == 0;
56 for (
tpccf::TPCFragmentTime t = fragment.firstNonOverlapTimeBin(); t < fragment.lastNonOverlapTimeBin(); t += NumOfCachedTimebins) {
57 const ChargePos pos = basePos.delta({localPadId, int16_t(t + localTimeBin)});
58 smem.charges[localPadId][localTimeBin] = (
pos.valid()) ? chargeMap[
pos].unpack() : 0;
61 for (int32_t
i = 0;
i < NumOfCachedTimebins;
i++) {
62 const Charge q = smem.charges[localPadId][
i];
63 totalCharges += (q > 0);
64 consecCharges = (q > 0) ? consecCharges + 1 : 0;
65 maxConsecCharges = CAMath::Max(consecCharges, maxConsecCharges);
66 maxCharge = CAMath::Max<Charge>(q, maxCharge);
75 updatePadBaseline(basePad + localPadId, clusterer, totalCharges, maxConsecCharges, maxCharge);
80 constexpr size_t ElemsInTileRow = (size_t)
TilingLayout<
GridSize<2>>::WidthInTiles * TimebinsPerCacheline * PadsPerCacheline;
83 using UShort8 = Vc::fixed_size_simd<uint16_t, PadsPerCacheline>;
84 using Charge8 = Vc::fixed_size_simd<float, PadsPerCacheline>;
86 UShort8 totalCharges{Vc::Zero};
87 UShort8 consecCharges{Vc::Zero};
88 UShort8 maxConsecCharges{Vc::Zero};
89 Charge8 maxCharge{Vc::Zero};
91 std::array<uint16_t, PadsPerCacheline> totalCharges{0};
92 std::array<uint16_t, PadsPerCacheline> consecCharges{0};
93 std::array<uint16_t, PadsPerCacheline> maxConsecCharges{0};
94 std::array<Charge, PadsPerCacheline> maxCharge{0};
100 const uint16_t* packedChargeStart =
reinterpret_cast<uint16_t*
>(&chargeMap[basePos.delta({0, t})]);
102 for (; t < fragment.lastNonOverlapTimeBin(); t += TimebinsPerCacheline) {
105 const UShort8 packedCharges{packedChargeStart + PadsPerCacheline * localtime, Vc::Aligned};
106 const UShort8::mask_type isCharge = packedCharges != 0;
108 if (isCharge.isNotEmpty()) {
109 totalCharges(isCharge)++;
111 consecCharges(not isCharge) = 0;
112 maxConsecCharges = Vc::max(consecCharges, maxConsecCharges);
121 maxCharge = Vc::max(maxCharge, unpackedCharges);
126 for (
tpccf::Pad localpad = 0; localpad < PadsPerCacheline; localpad++) {
127 const uint16_t packedCharge = packedChargeStart[PadsPerCacheline * localtime + localpad];
128 const bool isCharge = packedCharge != 0;
130 totalCharges[localpad]++;
131 consecCharges[localpad]++;
132 maxConsecCharges[localpad] = CAMath::Max(maxConsecCharges[localpad], consecCharges[localpad]);
135 maxCharge[localpad] = CAMath::Max<Charge>(maxCharge[localpad], unpackedCharge);
137 consecCharges[localpad] = 0;
143 packedChargeStart += ElemsInTileRow;
146 for (
tpccf::Pad localpad = 0; localpad < PadsPerCacheline; localpad++) {
147 updatePadBaseline(basePad + localpad, clusterer, totalCharges[localpad], maxConsecCharges[localpad], maxCharge[localpad]);