|
14 | 14 |
|
15 | 15 | #include "GPUTPCTracker.h" |
16 | 16 | #include "GPUTPCRow.h" |
17 | | -#include "GPUTPCTrack.h" |
18 | 17 | #include "GPUCommonMath.h" |
| 18 | +#include "MemLayout.h" |
19 | 19 |
|
20 | 20 | #include "GPUTPCClusterData.h" |
21 | 21 | #include "GPUO2DataTypes.h" |
22 | 22 | #include "GPUTPCTrackParam.h" |
| 23 | +#include "GPUTPCTracklet.h" |
| 24 | +#include "GPUTPCTrack.h" |
23 | 25 | #include "GPUParam.inc" |
24 | 26 | #include "GPUTPCConvertImpl.h" |
25 | 27 | #include "GPUDefParametersRuntime.h" |
|
29 | 31 | #include <cmath> |
30 | 32 | #include <algorithm> |
31 | 33 | #include <stdexcept> |
| 34 | +#include <type_traits> |
32 | 35 |
|
33 | 36 | #include "GPUReconstruction.h" |
34 | 37 | #include "GPUMemorySizeScalers.h" |
@@ -108,47 +111,41 @@ void GPUTPCTracker::RegisterMemoryAllocation() |
108 | 111 | mMemoryResOutput = mRec->RegisterMemoryAllocation(this, &GPUTPCTracker::SetPointersOutput, type, "TPCTrackerTracks"); |
109 | 112 | } |
110 | 113 |
|
111 | | -GPUhd() void GPUTPCTracker::SetPointersTrackletsHelper(void* & mem, MemLayout::interface<GPUTPCTrackletSkeleton, MemLayout::pointer, MemLayout::Flag::aos>::type& tracklets) { |
112 | | - computePointerWithAlignment(mem, tracklets, mNMaxTracklets); |
113 | | -} |
| 114 | +namespace { |
| 115 | + |
| 116 | +template <class Function> |
| 117 | +struct ApplyMemberwise { |
| 118 | + Function g; |
| 119 | + |
| 120 | + template <class ...Args> |
| 121 | + void operator()(Args& ...args) const { (g(args), ...); } |
| 122 | +}; |
114 | 123 |
|
115 | | -GPUhd() void GPUTPCTracker::SetPointersTrackletsHelper(void* & mem, MemLayout::interface<GPUTPCTrackletSkeleton, MemLayout::pointer, MemLayout::Flag::soa>::type& tracklets) { |
116 | | - computePointerWithAlignment(mem, tracklets.mFirstRow, mNMaxTracklets); |
117 | | - computePointerWithAlignment(mem, tracklets.mLastRow, mNMaxTracklets); |
| 124 | +template <class Function> |
| 125 | +struct ApplyRecursive { |
| 126 | + Function f; |
118 | 127 |
|
119 | | - computePointerWithAlignment(mem, tracklets.mParam.mX, mNMaxTracklets); |
120 | | - computePointerWithAlignment(mem, tracklets.mParam.mC, mNMaxTracklets); |
121 | | - computePointerWithAlignment(mem, tracklets.mParam.mZOffset, mNMaxTracklets); |
122 | | - computePointerWithAlignment(mem, tracklets.mParam.mP, mNMaxTracklets); |
| 128 | + template <class T> |
| 129 | + void operator()(T * & aos) const { f(aos); } |
| 130 | + |
| 131 | + template <template <template <class> class> class S> |
| 132 | + void operator()(S<MemLayout::pointer>& soa) const { soa.apply(ApplyMemberwise<ApplyRecursive>{f}); } |
| 133 | +}; |
123 | 134 |
|
124 | | - computePointerWithAlignment(mem, tracklets.mHitWeight, mNMaxTracklets); |
125 | | - computePointerWithAlignment(mem, tracklets.mFirstHit, mNMaxTracklets); |
126 | 135 | } |
127 | 136 |
|
128 | 137 | GPUhd() void* GPUTPCTracker::SetPointersTracklets(void* mem) |
129 | 138 | { |
130 | | - SetPointersTrackletsHelper(mem, mTracklets); |
| 139 | + auto tracklet_helper = [&mem, this](auto& tracklets) -> void { computePointerWithAlignment(mem, tracklets, mNMaxTracklets); }; |
| 140 | + ApplyRecursive{tracklet_helper}(mTracklets); |
131 | 141 | computePointerWithAlignment(mem, mTrackletRowHits, mNMaxRowHits); |
132 | 142 | return mem; |
133 | 143 | } |
134 | 144 |
|
135 | | -GPUhd() void GPUTPCTracker::SetPointersTracksHelper(void* & mem, MemLayout::interface<GPUTPCTrackSkeleton, MemLayout::pointer, MemLayout::Flag::aos>::type& tracks) { |
136 | | - computePointerWithAlignment(mem, tracks, mNMaxTracks); |
137 | | -} |
138 | | - |
139 | | -GPUhd() void GPUTPCTracker::SetPointersTracksHelper(void* & mem, MemLayout::interface<GPUTPCTrackSkeleton, MemLayout::pointer, MemLayout::Flag::soa>::type& tracks) { |
140 | | - computePointerWithAlignment(mem, tracks.mFirstHitID, mNMaxTracks); |
141 | | - computePointerWithAlignment(mem, tracks.mNHits, mNMaxTracks); |
142 | | - computePointerWithAlignment(mem, tracks.mLocalTrackId, mNMaxTracks); |
143 | | - computePointerWithAlignment(mem, tracks.mParam.mX, mNMaxTracks); |
144 | | - computePointerWithAlignment(mem, tracks.mParam.mC, mNMaxTracks); |
145 | | - computePointerWithAlignment(mem, tracks.mParam.mZOffset, mNMaxTracks); |
146 | | - computePointerWithAlignment(mem, tracks.mParam.mP, mNMaxTracks); |
147 | | -} |
148 | | - |
149 | 145 | GPUhd() void* GPUTPCTracker::SetPointersOutput(void* mem) |
150 | 146 | { |
151 | | - SetPointersTracksHelper(mem, mTracks); |
| 147 | + auto track_helper = [&mem, this](auto& tracks) -> void { computePointerWithAlignment(mem, tracks, mNMaxTracks); }; |
| 148 | + ApplyRecursive{track_helper}(mTracks); |
152 | 149 | computePointerWithAlignment(mem, mTrackHits, mNMaxTrackHits); |
153 | 150 | return mem; |
154 | 151 | } |
|
0 commit comments