Skip to content

Commit fdb198d

Browse files
committed
ITS: apply virtual to vertexer
1 parent d913dba commit fdb198d

File tree

8 files changed

+45
-147
lines changed

8 files changed

+45
-147
lines changed

Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/VertexerTraitsGPU.h

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,20 @@ class ROframe;
3737

3838
using constants::its2::InversePhiBinSize;
3939

40-
class VertexerTraitsGPU : public VertexerTraits
40+
class VertexerTraitsGPU final : public VertexerTraits
4141
{
4242
public:
43-
VertexerTraitsGPU();
44-
~VertexerTraitsGPU() = default;
45-
void initialise(const TrackingParameters&, const int iteration = 0) override;
46-
void adoptTimeFrame(TimeFrame*) override;
47-
void computeTracklets(const int iteration = 0) override;
48-
void computeTrackletMatching(const int iteration = 0) override;
49-
void computeVertices(const int iteration = 0) override;
50-
void updateVertexingParameters(const std::vector<VertexingParameters>&, const TimeFrameGPUParameters&) override;
51-
52-
// Hybrid
53-
void initialiseHybrid(const TrackingParameters& pars, const int iteration = 0) override { VertexerTraits::initialise(pars, iteration); }
54-
void computeTrackletsHybrid(const int iteration = 0) override { VertexerTraits::computeTracklets(iteration); }
55-
void computeTrackletMatchingHybrid(const int iteration = 0) override { VertexerTraits::computeTrackletMatching(iteration); }
56-
void computeVerticesHybrid(const int iteration = 0) override { VertexerTraits::computeVertices(iteration); }
57-
void adoptTimeFrameHybrid(TimeFrame* tf) override { VertexerTraits::adoptTimeFrame(tf); }
58-
43+
void initialise(const TrackingParameters&, const int iteration = 0) final;
44+
void adoptTimeFrame(TimeFrame*) final;
45+
void computeTracklets(const int iteration = 0) final;
46+
void computeTrackletMatching(const int iteration = 0) final;
47+
void computeVertices(const int iteration = 0) final;
48+
void updateVertexingParameters(const std::vector<VertexingParameters>&, const TimeFrameGPUParameters&) final;
5949
void computeVerticesHist();
6050

51+
virtual bool isGPU() final { return true; }
52+
virtual const char* getName() final { return "GPU"; }
53+
6154
protected:
6255
IndexTableUtils* mDeviceIndexTableUtils;
6356
gpu::TimeFrameGPU<7>* mTimeFrameGPU;

Detectors/ITSMFT/ITS/tracking/GPU/cuda/VertexerTraitsGPU.cxx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@
2828

2929
namespace o2::its
3030
{
31-
VertexerTraitsGPU::VertexerTraitsGPU()
32-
{
33-
setIsGPU(true);
34-
}
3531

3632
void VertexerTraitsGPU::initialise(const TrackingParameters& trackingParams, const int iteration)
3733
{

Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingInterface.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ class ITSTrackingInterface
5252
}
5353
// Task callbacks
5454
void initialise();
55-
template <bool isGPU = false>
5655
void run(framework::ProcessingContext& pc);
5756
void printSummary() const;
5857

Detectors/ITSMFT/ITS/tracking/include/ITStracking/Vertexer.h

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ using Vertex = o2::dataformats::Vertex<o2::dataformats::TimeStamp<int>>;
4646

4747
class Vertexer
4848
{
49+
using LogFunc = std::function<void(const std::string& s)>;
50+
4951
public:
5052
Vertexer(VertexerTraits* traits);
5153
virtual ~Vertexer() = default;
@@ -60,43 +62,31 @@ class Vertexer
6062
std::vector<Vertex> exportVertices();
6163
VertexerTraits* getTraits() const { return mTraits; };
6264

63-
float clustersToVertices(std::function<void(std::string s)> = [](std::string s) { std::cout << s << std::endl; });
64-
float clustersToVerticesHybrid(std::function<void(std::string s)> = [](std::string s) { std::cout << s << std::endl; });
65+
float clustersToVertices(LogFunc = [](const std::string& s) { std::cout << s << '\n'; });
6566
void filterMCTracklets();
6667

6768
template <typename... T>
6869
void findTracklets(T&&... args);
69-
template <typename... T>
70-
void findTrackletsHybrid(T&&... args);
71-
7270
void findTrivialMCTracklets();
7371
template <typename... T>
7472
void validateTracklets(T&&... args);
7573
template <typename... T>
76-
void validateTrackletsHybrid(T&&... args);
77-
template <typename... T>
7874
void findVertices(T&&... args);
79-
template <typename... T>
80-
void findVerticesHybrid(T&&... args);
8175
void findHistVertices();
8276

8377
template <typename... T>
8478
void initialiseVertexer(T&&... args);
8579
template <typename... T>
8680
void initialiseTimeFrame(T&&... args);
87-
template <typename... T>
88-
void initialiseVertexerHybrid(T&&... args);
89-
template <typename... T>
90-
void initialiseTimeFrameHybrid(T&&... args);
9181

9282
// Utils
9383
void dumpTraits();
9484
template <typename... T>
95-
float evaluateTask(void (Vertexer::*)(T...), const char*, std::function<void(std::string s)> logger, T&&... args);
96-
void printEpilog(std::function<void(std::string s)> logger,
97-
bool isHybrid,
98-
const unsigned int trackletN01, const unsigned int trackletN12, const unsigned selectedN, const unsigned int vertexN,
99-
const float initT, const float trackletT, const float selecT, const float vertexT);
85+
float evaluateTask(void (Vertexer::*)(T...), const char*, LogFunc logger, T&&... args);
86+
void printEpilog(LogFunc& logger,
87+
const unsigned int trackletN01, const unsigned int trackletN12,
88+
const unsigned selectedN, const unsigned int vertexN, const float initT,
89+
const float trackletT, const float selecT, const float vertexT);
10090

10191
private:
10292
std::uint32_t mTimeFrameCounter = 0;
@@ -147,31 +137,7 @@ inline void Vertexer::findVertices(T&&... args)
147137
}
148138

149139
template <typename... T>
150-
void Vertexer::initialiseVertexerHybrid(T&&... args)
151-
{
152-
mTraits->initialiseHybrid(std::forward<T>(args)...);
153-
}
154-
155-
template <typename... T>
156-
void Vertexer::findTrackletsHybrid(T&&... args)
157-
{
158-
mTraits->computeTrackletsHybrid(std::forward<T>(args)...);
159-
}
160-
161-
template <typename... T>
162-
inline void Vertexer::validateTrackletsHybrid(T&&... args)
163-
{
164-
mTraits->computeTrackletMatchingHybrid(std::forward<T>(args)...);
165-
}
166-
167-
template <typename... T>
168-
inline void Vertexer::findVerticesHybrid(T&&... args)
169-
{
170-
mTraits->computeVerticesHybrid(std::forward<T>(args)...);
171-
}
172-
173-
template <typename... T>
174-
float Vertexer::evaluateTask(void (Vertexer::*task)(T...), const char* taskName, std::function<void(std::string s)> logger,
140+
float Vertexer::evaluateTask(void (Vertexer::*task)(T...), const char* taskName, LogFunc logger,
175141
T&&... args)
176142
{
177143
float diff{0.f};

Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class VertexerTraits
5151
VertexerTraits() = default;
5252
virtual ~VertexerTraits() = default;
5353

54-
GPUhd() static constexpr int4 getEmptyBinsRect()
54+
GPUhdi() static consteval int4 getEmptyBinsRect()
5555
{
5656
return int4{0, 0, 0, 0};
5757
}
@@ -68,12 +68,6 @@ class VertexerTraits
6868
virtual void computeVertices(const int iteration = 0);
6969
virtual void adoptTimeFrame(TimeFrame* tf);
7070
virtual void updateVertexingParameters(const std::vector<VertexingParameters>& vrtPar, const TimeFrameGPUParameters& gpuTfPar);
71-
// Hybrid
72-
virtual void initialiseHybrid(const TrackingParameters& trackingParams, const int iteration = 0) { initialise(trackingParams, iteration); };
73-
virtual void computeTrackletsHybrid(const int iteration = 0) { computeTracklets(iteration); };
74-
virtual void computeTrackletMatchingHybrid(const int iteration = 0) { computeTrackletMatching(iteration); };
75-
virtual void computeVerticesHybrid(const int iteration = 0) { computeVertices(iteration); };
76-
virtual void adoptTimeFrameHybrid(TimeFrame* tf) { adoptTimeFrame(tf); };
7771

7872
void computeVerticesInRof(int,
7973
gsl::span<const o2::its::Line>&,
@@ -93,12 +87,12 @@ class VertexerTraits
9387
// utils
9488
std::vector<VertexingParameters>& getVertexingParameters() { return mVrtParams; }
9589
std::vector<VertexingParameters> getVertexingParameters() const { return mVrtParams; }
96-
void setIsGPU(const unsigned char isgpu) { mIsGPU = isgpu; };
9790
void setVertexingParameters(std::vector<VertexingParameters>& vertParams) { mVrtParams = vertParams; }
98-
unsigned char getIsGPU() const { return mIsGPU; };
9991
void dumpVertexerTraits();
10092
void setNThreads(int n);
10193
int getNThreads() const { return mNThreads; }
94+
virtual bool isGPU() const noexcept { return false; }
95+
virtual const char* getName() const noexcept { return "CPU"; }
10296

10397
template <typename T = o2::MCCompLabel>
10498
static std::pair<T, float> computeMain(const std::vector<T>& elements)
@@ -116,7 +110,6 @@ class VertexerTraits
116110
}
117111

118112
protected:
119-
unsigned char mIsGPU;
120113
int mNThreads = 1;
121114

122115
std::vector<VertexingParameters> mVrtParams;
@@ -129,7 +122,6 @@ class VertexerTraits
129122
inline void VertexerTraits::initialise(const TrackingParameters& trackingParams, const int iteration)
130123
{
131124
mTimeFrame->initialise(0, trackingParams, 3, (bool)(!iteration)); // iteration for initialisation must be 0 for correctly resetting the frame, we need to pass the non-reset flag for vertices as well, tho.
132-
setIsGPU(false);
133125
}
134126

135127
GPUhdi() const int2 VertexerTraits::getPhiBins(float phi, float dPhi)

Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ void ITSTrackingInterface::initialise()
139139
mVertexer->setParameters(vertParams);
140140
}
141141

142-
template <bool isGPU>
143142
void ITSTrackingInterface::run(framework::ProcessingContext& pc)
144143
{
145144
auto compClusters = pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("compClusters");
@@ -224,11 +223,7 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
224223
if (mRunVertexer) {
225224
vertROFvec.reserve(trackROFvec.size());
226225
// Run seeding vertexer
227-
if constexpr (isGPU) {
228-
vertexerElapsedTime = mVertexer->clustersToVerticesHybrid(logger);
229-
} else {
230-
vertexerElapsedTime = mVertexer->clustersToVertices(logger);
231-
}
226+
vertexerElapsedTime = mVertexer->clustersToVertices(logger);
232227
} else { // cosmics
233228
mTimeFrame->resetRofPV();
234229
}
@@ -453,8 +448,5 @@ void ITSTrackingInterface::loadROF(gsl::span<itsmft::ROFRecord>& trackROFspan,
453448
{
454449
mTimeFrame->loadROFrameData(trackROFspan, clusters, pattIt, mDict, mcLabels);
455450
}
456-
457-
template void ITSTrackingInterface::run<true>(framework::ProcessingContext& pc);
458-
template void ITSTrackingInterface::run<false>(framework::ProcessingContext& pc);
459451
} // namespace its
460452
} // namespace o2

Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx

Lines changed: 20 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,76 +21,40 @@
2121
#include "ITStracking/VertexerTraits.h"
2222
#include "ITStracking/TrackingConfigParam.h"
2323

24-
#include <array>
25-
26-
namespace o2
27-
{
28-
namespace its
24+
namespace o2::its
2925
{
3026

31-
Vertexer::Vertexer(VertexerTraits* traits)
27+
Vertexer::Vertexer(VertexerTraits* traits) : mTraits(traits)
3228
{
33-
if (!traits) {
29+
if (!mTraits) {
3430
LOG(fatal) << "nullptr passed to ITS vertexer construction.";
3531
}
3632
mVertParams.resize(1);
37-
mTraits = traits;
3833
}
3934

40-
float Vertexer::clustersToVertices(std::function<void(std::string s)> logger)
35+
float Vertexer::clustersToVertices(LogFunc logger)
4136
{
37+
LogFunc evalLog = [](const std::string&) {};
4238
TrackingParameters trkPars;
4339
TimeFrameGPUParameters tfGPUpar;
4440
mTraits->updateVertexingParameters(mVertParams, tfGPUpar);
4541
float timeTracklet{0.f}, timeSelection{0.f}, timeVertexing{0.f}, timeInit{0.f};
4642
for (int iteration = 0; iteration < std::min(mVertParams[0].nIterations, (int)mVertParams.size()); ++iteration) {
47-
unsigned int nTracklets01, nTracklets12;
48-
logger(fmt::format("ITS Seeding vertexer iteration {} summary:", iteration));
43+
unsigned int nTracklets01{0}, nTracklets12{0};
44+
logger(fmt::format("=== ITS {} Seeding vertexer iteration {} summary:", mTraits->getName(), iteration));
4945
trkPars.PhiBins = mTraits->getVertexingParameters()[0].PhiBins;
5046
trkPars.ZBins = mTraits->getVertexingParameters()[0].ZBins;
5147
auto timeInitIteration = evaluateTask(
52-
&Vertexer::initialiseVertexer, "Vertexer initialisation", [](std::string) {}, trkPars, iteration);
48+
&Vertexer::initialiseVertexer, " - Vertexer initialisation", evalLog, trkPars, iteration);
5349
auto timeTrackletIteration = evaluateTask(
54-
&Vertexer::findTracklets, "Vertexer tracklet finding", [](std::string) {}, iteration);
50+
&Vertexer::findTracklets, " - Vertexer tracklet finding", evalLog, iteration);
5551
nTracklets01 = mTimeFrame->getTotalTrackletsTF(0);
5652
nTracklets12 = mTimeFrame->getTotalTrackletsTF(1);
5753
auto timeSelectionIteration = evaluateTask(
58-
&Vertexer::validateTracklets, "Vertexer tracklets validation", [](std::string) {}, iteration);
54+
&Vertexer::validateTracklets, " - Vertexer tracklets validation", evalLog, iteration);
5955
auto timeVertexingIteration = evaluateTask(
60-
&Vertexer::findVertices, "Vertexer vertex finding", [](std::string) {}, iteration);
61-
printEpilog(logger, false, nTracklets01, nTracklets12, mTimeFrame->getNLinesTotal(), mTimeFrame->getTotVertIteration()[iteration], timeInitIteration, timeTrackletIteration, timeSelectionIteration, timeVertexingIteration);
62-
timeInit += timeInitIteration;
63-
timeTracklet += timeTrackletIteration;
64-
timeSelection += timeSelectionIteration;
65-
timeVertexing += timeVertexingIteration;
66-
}
67-
68-
return timeInit + timeTracklet + timeSelection + timeVertexing;
69-
}
70-
71-
float Vertexer::clustersToVerticesHybrid(std::function<void(std::string s)> logger)
72-
{
73-
TrackingParameters trkPars;
74-
TimeFrameGPUParameters tfGPUpar;
75-
float timeTracklet, timeSelection, timeVertexing, timeInit;
76-
mTraits->updateVertexingParameters(mVertParams, tfGPUpar);
77-
for (int iteration = 0; iteration < std::min(mVertParams[0].nIterations, (int)mVertParams.size()); ++iteration) {
78-
unsigned int nTracklets01, nTracklets12;
79-
logger(fmt::format("ITS Hybrid seeding vertexer iteration {} summary:", iteration));
80-
trkPars.PhiBins = mTraits->getVertexingParameters()[0].PhiBins;
81-
trkPars.ZBins = mTraits->getVertexingParameters()[0].ZBins;
82-
auto timeInitIteration = evaluateTask(
83-
&Vertexer::initialiseVertexerHybrid, "Hybrid Vertexer initialisation", [](std::string) {}, trkPars, iteration);
84-
auto timeTrackletIteration = evaluateTask(
85-
&Vertexer::findTrackletsHybrid, "Hybrid Vertexer tracklet finding", [](std::string) {}, iteration);
86-
nTracklets01 = mTimeFrame->getTotalTrackletsTF(0);
87-
nTracklets12 = mTimeFrame->getTotalTrackletsTF(1);
88-
auto timeSelectionIteration = evaluateTask(
89-
&Vertexer::validateTrackletsHybrid, "Hybrid Vertexer adjacent tracklets validation", [](std::string) {}, iteration);
90-
auto timeVertexingIteration = evaluateTask(
91-
&Vertexer::findVerticesHybrid, "Hybrid Vertexer vertex finding", [](std::string) {}, iteration);
92-
93-
printEpilog(logger, true, nTracklets01, nTracklets12, mTimeFrame->getNLinesTotal(), mTimeFrame->getTotVertIteration()[iteration], timeInitIteration, timeTrackletIteration, timeSelectionIteration, timeVertexingIteration);
56+
&Vertexer::findVertices, " - Vertexer vertex finding", evalLog, iteration);
57+
printEpilog(logger, nTracklets01, nTracklets12, mTimeFrame->getNLinesTotal(), mTimeFrame->getTotVertIteration()[iteration], timeInitIteration, timeTrackletIteration, timeSelectionIteration, timeVertexingIteration);
9458
timeInit += timeInitIteration;
9559
timeTracklet += timeTrackletIteration;
9660
timeSelection += timeSelectionIteration;
@@ -135,17 +99,16 @@ void Vertexer::adoptTimeFrame(TimeFrame& tf)
13599
mTraits->adoptTimeFrame(&tf);
136100
}
137101

138-
void Vertexer::printEpilog(std::function<void(std::string s)> logger,
139-
bool isHybrid,
140-
const unsigned int trackletN01, const unsigned int trackletN12, const unsigned selectedN, const unsigned int vertexN,
141-
const float initT, const float trackletT, const float selecT, const float vertexT)
102+
void Vertexer::printEpilog(LogFunc& logger,
103+
const unsigned int trackletN01, const unsigned int trackletN12,
104+
const unsigned selectedN, const unsigned int vertexN, const float initT,
105+
const float trackletT, const float selecT, const float vertexT)
142106
{
143107
float total = initT + trackletT + selecT + vertexT;
144-
logger(fmt::format(" - {}Vertexer: found {} | {} tracklets in: {} ms", isHybrid ? "Hybrid " : "", trackletN01, trackletN12, trackletT));
145-
logger(fmt::format(" - {}Vertexer: selected {} tracklets in: {} ms", isHybrid ? "Hybrid " : "", selectedN, selecT));
146-
logger(fmt::format(" - {}Vertexer: found {} vertices in: {} ms", isHybrid ? "Hybrid " : "", vertexN, vertexT));
108+
logger(fmt::format(" - {} Vertexer: found {} | {} tracklets in: {} ms", mTraits->getName(), trackletN01, trackletN12, trackletT));
109+
logger(fmt::format(" - {} Vertexer: selected {} tracklets in: {} ms", mTraits->getName(), selectedN, selecT));
110+
logger(fmt::format(" - {} Vertexer: found {} vertices in: {} ms", mTraits->getName(), vertexN, vertexT));
147111
// logger(fmt::format(" - Timeframe {} vertexing completed in: {} ms, using {} thread(s).", mTimeFrameCounter++, total, mTraits->getNThreads()));
148112
}
149113

150-
} // namespace its
151-
} // namespace o2
114+
} // namespace o2::its

Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/TrackerSpec.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828

2929
#include "TStopwatch.h"
3030

31-
namespace o2
32-
{
33-
namespace its
31+
namespace o2::its
3432
{
3533

3634
class TrackerDPL : public framework::Task
@@ -61,7 +59,6 @@ class TrackerDPL : public framework::Task
6159
using o2::its::TrackingMode;
6260
framework::DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int useTrig, const std::string& trMode, const bool overrBeamEst = false, gpu::GPUDataTypes::DeviceType dType = gpu::GPUDataTypes::DeviceType::CPU);
6361

64-
} // namespace its
65-
} // namespace o2
62+
} // namespace o2::its
6663

6764
#endif /* O2_ITS_TRACKERDPL */

0 commit comments

Comments
 (0)