Skip to content

Commit 01af595

Browse files
Add manual SoA
1 parent 696fa58 commit 01af595

File tree

7 files changed

+54
-23
lines changed

7 files changed

+54
-23
lines changed

GPU/Common/wrapper.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ using reference = T&;
1818
template <class T>
1919
using const_reference = const T&;
2020

21+
template <class T>
22+
using pointer = T*;
23+
24+
template <class T>
25+
using const_pointer = const T*;
26+
2127
template<
2228
template <template <class> class> class S,
2329
template <class> class F,

GPU/GPUTracking/SectorTracker/GPUTPCTracker.cxx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,11 @@ void GPUTPCTracker::RegisterMemoryAllocation()
110110

111111
GPUhd() void* GPUTPCTracker::SetPointersTracklets(void* mem)
112112
{
113-
computePointerWithAlignment(mem, mTracklets, mNMaxTracklets);
113+
computePointerWithAlignment(mem, mTracklets.mFirstRow, mNMaxTracklets);
114+
computePointerWithAlignment(mem, mTracklets.mLastRow, mNMaxTracklets);
115+
computePointerWithAlignment(mem, mTracklets.mParam, mNMaxTracklets);
116+
computePointerWithAlignment(mem, mTracklets.mHitWeight, mNMaxTracklets);
117+
computePointerWithAlignment(mem, mTracklets.mFirstHit, mNMaxTracklets);
114118
computePointerWithAlignment(mem, mTrackletRowHits, mNMaxRowHits);
115119
return mem;
116120
}

GPU/GPUTracking/SectorTracker/GPUTPCTracker.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ class GPUTPCRow;
3737
class GPUTPCTracker : public GPUProcessor
3838
{
3939
public:
40+
template <class T> using pointer = T*;
41+
template <class T> using const_reference = const T&;
42+
4043
#ifndef GPUCA_GPUCODE_DEVICE
4144
GPUTPCTracker() = default;
4245
~GPUTPCTracker();
@@ -183,8 +186,18 @@ class GPUTPCTracker : public GPUProcessor
183186
GPUhd() GPUglobalref() const GPUTPCHitId* TrackletStartHits() const { return mTrackletStartHits; }
184187
GPUhd() GPUglobalref() GPUTPCHitId* TrackletStartHits() { return mTrackletStartHits; }
185188
GPUhd() GPUglobalref() GPUTPCHitId* TrackletTmpStartHits() const { return mTrackletTmpStartHits; }
186-
GPUhd() GPUglobalref() const GPUTPCTracklet& Tracklet(int32_t i) const { return mTracklets[i]; }
187-
GPUhd() GPUglobalref() GPUTPCTracklet* Tracklets() const { return mTracklets; }
189+
190+
GPUhd() GPUglobalref() GPUTPCTracklet_reference Tracklet(int32_t i) {
191+
return {
192+
mTracklets.mFirstRow[i],
193+
mTracklets.mLastRow[i],
194+
mTracklets.mParam[i],
195+
mTracklets.mHitWeight[i],
196+
mTracklets.mFirstHit[i]
197+
};
198+
}
199+
200+
GPUhd() GPUglobalref() GPUTPCTracklet_pointer Tracklets() const { return mTracklets; }
188201
GPUhd() GPUglobalref() calink* TrackletRowHits() const { return mTrackletRowHits; }
189202

190203
GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracks() const { return &mCommonMem->nTracks; }
@@ -238,7 +251,7 @@ class GPUTPCTracker : public GPUProcessor
238251
// event
239252
GPUglobalref() commonMemoryStruct* mCommonMem = nullptr; // common event memory
240253
GPUglobalref() GPUTPCHitId* mTrackletStartHits = nullptr; // start hits for the tracklets
241-
GPUglobalref() GPUTPCTracklet* mTracklets = nullptr; // tracklets
254+
GPUglobalref() GPUTPCTracklet_pointer mTracklets;// tracklets
242255
GPUglobalref() calink* mTrackletRowHits = nullptr; // Hits for each Tracklet in each row
243256
GPUglobalref() GPUTPCTrack* mTracks = nullptr; // reconstructed tracks
244257
GPUglobalref() GPUTPCHitId* mTrackHits = nullptr; // array of track hit numbers

GPU/GPUTracking/SectorTracker/GPUTPCTrackerDump.cxx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -129,22 +129,22 @@ void GPUTPCTracker::DumpTrackletHits(std::ostream& out)
129129
std::iota(Ids.begin(), Ids.end(), 0);
130130
if (mRec->GetProcessingSettings().deterministicGPUReconstruction) {
131131
std::sort(Ids.begin(), Ids.end(), [this](const int32_t& a, const int32_t& b) {
132-
if (this->Tracklets()[a].FirstRow() != this->Tracklets()[b].FirstRow()) {
133-
return this->Tracklets()[a].FirstRow() > this->Tracklets()[b].FirstRow();
132+
if (this->Tracklet(a).FirstRow() != this->Tracklet(b).FirstRow()) {
133+
return this->Tracklet(a).FirstRow() > this->Tracklet(b).FirstRow();
134134
}
135-
if (this->Tracklets()[a].LastRow() != this->Tracklets()[b].LastRow()) {
136-
return this->Tracklets()[a].LastRow() > this->Tracklets()[b].LastRow();
135+
if (this->Tracklet(a).LastRow() != this->Tracklet(b).LastRow()) {
136+
return this->Tracklet(a).LastRow() > this->Tracklet(b).LastRow();
137137
}
138-
if (this->Tracklets()[a].Param().Y() != this->Tracklets()[b].Param().Y()) {
139-
return this->Tracklets()[a].Param().Y() > this->Tracklets()[b].Param().Y();
138+
if (this->Tracklet(a).Param().Y() != this->Tracklet(b).Param().Y()) {
139+
return this->Tracklet(a).Param().Y() > this->Tracklet(b).Param().Y();
140140
}
141-
return this->Tracklets()[a].Param().Z() > this->Tracklets()[b].Param().Z();
141+
return this->Tracklet(a).Param().Z() > this->Tracklet(b).Param().Z();
142142
});
143143
}
144144
for (int32_t jj = 0; jj < nTracklets; jj++) {
145145
const int32_t j = Ids[jj];
146-
const auto& tracklet = Tracklets()[j];
147-
out << "Tracklet " << std::setw(4) << jj << " (Rows: " << Tracklets()[j].FirstRow() << " - " << tracklet.LastRow() << ", Weight " << Tracklets()[j].HitWeight() << ") ";
146+
const auto& tracklet = Tracklet(j);
147+
out << "Tracklet " << std::setw(4) << jj << " (Rows: " << Tracklet(j).FirstRow() << " - " << tracklet.LastRow() << ", Weight " << Tracklet(j).HitWeight() << ") ";
148148
if (tracklet.LastRow() > tracklet.FirstRow() && (tracklet.FirstRow() >= GPUCA_ROW_COUNT || tracklet.LastRow() >= GPUCA_ROW_COUNT)) {
149149
GPUError("Error: Tracklet %d First %d Last %d", j, tracklet.FirstRow(), tracklet.LastRow());
150150
out << " (Error: Tracklet " << j << " First " << tracklet.FirstRow() << " Last " << tracklet.LastRow() << ") ";

GPU/GPUTracking/SectorTracker/GPUTPCTracklet.h

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "GPUTPCBaseTrackParam.h"
1919
#include "GPUTPCDef.h"
20+
#include "wrapper.h"
2021

2122
namespace o2::gpu
2223
{
@@ -26,11 +27,12 @@ namespace o2::gpu
2627
* The class describes the reconstructed TPC track candidate.
2728
* The class is dedicated for internal use by the GPUTPCTracker algorithm.
2829
*/
29-
class GPUTPCTracklet
30+
template <template <class> class F>
31+
class GPUTPCTrackletSkeleton
3032
{
3133
public:
3234
#if !defined(GPUCA_GPUCODE)
33-
GPUTPCTracklet() : mFirstRow(0), mLastRow(0), mParam(), mHitWeight(0), mFirstHit(0) {};
35+
//GPUTPCTrackletSkeleton() : mFirstRow(0), mLastRow(0), mParam(), mHitWeight(0), mFirstHit(0) {};
3436
#endif //! GPUCA_GPUCODE
3537

3638
GPUhd() int32_t FirstRow() const { return mFirstRow; }
@@ -45,13 +47,19 @@ class GPUTPCTracklet
4547
GPUhd() void SetParam(const GPUTPCBaseTrackParam& v) { mParam = reinterpret_cast<const GPUTPCBaseTrackParam&>(v); }
4648
GPUhd() void SetHitWeight(const int32_t w) { mHitWeight = w; }
4749

48-
private:
49-
int32_t mFirstRow; // first TPC row // TODO: We can use smaller data format here!
50-
int32_t mLastRow; // last TPC row
51-
GPUTPCBaseTrackParam mParam; // tracklet parameters
52-
int32_t mHitWeight; // Hit Weight of Tracklet
53-
uint32_t mFirstHit; // first hit in row hit array
50+
// private:
51+
F<int32_t> mFirstRow; // first TPC row // TODO: We can use smaller data format here!
52+
F<int32_t> mLastRow; // last TPC row
53+
F<GPUTPCBaseTrackParam> mParam; // tracklet parameters -- GPUTPCBaseTrackParamSkeleton<F>
54+
F<int32_t> mHitWeight; // Hit Weight of Tracklet
55+
F<uint32_t> mFirstHit; // first hit in row hit array
5456
};
57+
58+
using GPUTPCTracklet = GPUTPCTrackletSkeleton<wrapper::value>;
59+
using GPUTPCTracklet_reference = GPUTPCTrackletSkeleton<wrapper::reference>;
60+
using GPUTPCTracklet_const_reference = GPUTPCTrackletSkeleton<wrapper::const_reference>;
61+
using GPUTPCTracklet_pointer = GPUTPCTrackletSkeleton<wrapper::pointer>;
62+
5563
} // namespace o2::gpu
5664

5765
#endif // GPUTPCTRACKLET_H

GPU/GPUTracking/SectorTracker/GPUTPCTrackletConstructor.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ GPUd() void GPUTPCTrackletConstructor::StoreTracklet(int32_t /*nBlocks*/, int32_
7878
return;
7979
}
8080

81-
GPUglobalref() GPUTPCTracklet& GPUrestrict() tracklet = tracker.Tracklets()[itrout];
81+
GPUglobalref() GPUTPCTracklet_reference GPUrestrict() tracklet = tracker.Tracklet(itrout);
8282

8383
CADEBUG(printf(" Storing tracklet: %d rows\n", nHits));
8484

GPU/GPUTracking/SectorTracker/GPUTPCTrackletSelector.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ GPUdii() void GPUTPCTrackletSelector::Thread<0>(int32_t nBlocks, int32_t nThread
3939
for (int32_t itr = s.mItr0 + iThread; itr < s.mNTracklets; itr += s.mNThreadsTotal) {
4040
GPUbarrierWarp();
4141

42-
GPUglobalref() GPUTPCTracklet& GPUrestrict() tracklet = tracker.Tracklets()[itr];
42+
GPUglobalref() GPUTPCTracklet_reference GPUrestrict() tracklet = tracker.Tracklet(itr);
4343

4444
int32_t firstRow = tracklet.FirstRow();
4545
int32_t lastRow = tracklet.LastRow();

0 commit comments

Comments
 (0)