51 using LogFunc = std::function<
void(
const std::string& s)>;
59 const LogFunc& = [](
const std::string& s) { std::cout << s <<
'\n'; },
60 const LogFunc& = [](
const std::string& s) { std::cerr << s <<
'\n'; });
64 const LogFunc& = [](
const std::string& s) { std::cout << s <<
'\n'; });
66 void setParameters(
const std::vector<TrackingParameters>& p) { mTrkParams = p; }
67 void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool) { mMemoryPool = pool; }
71 void setNThreads(
int n, std::shared_ptr<tbb::task_arena>& arena) { mTraits->setNThreads(
n, arena); }
76 void initialiseTimeFrame(
int iteration) { mTraits->initialiseTimeFrame(iteration); }
77 void computeTracklets(
int iteration,
int iVertex) { mTraits->computeLayerTracklets(iteration, iVertex); }
78 void computeCells(
int iteration) { mTraits->computeLayerCells(iteration); }
79 void computeVertexCandidates(
int iteration) { mTraits->computeVertexCandidates(iteration); }
80 void computeBeamFromVertices(
int iteration) { mTraits->computeBeamFromVertices(iteration); }
81 void computeVertices(
int iteration) { mTraits->computeVertices(iteration); }
82 void findCellsNeighbours(
int iteration) { mTraits->findCellsNeighbours(iteration); }
83 void findRoads(
int iteration) { mTraits->findRoads(iteration); }
85 void rectifyClusterIndices();
88 template <
typename...
T,
typename... F>
89 float evaluateTask(
void (Tracker::*task)(
T...),
std::string_view taskName,
int iteration, const LogFunc& logger, F&&... args);
91 TrackerTraits<NLayers>* mTraits =
nullptr;
92 TimeFrame<NLayers>* mTimeFrame =
nullptr;
94 std::vector<TrackingParameters> mTrkParams;
98 unsigned int mNumberOfDroppedTFs{0};
99 unsigned int mTimeFrameCounter{0};
100 double mTotalTime{0};
101 std::shared_ptr<BoundedMemoryResource> mMemoryPool;
115 Steps mCurStep{TFInit};
116 static constexpr std::array<const char*, NSteps> StateNames{
"TimeFrame initialisation",
"Tracklet finding",
"Cell finding",
"Neighbour finding",
"Road finding",
"Track extending",
"Cell linearisation",
"Beam positioning",
"Seeding vertices"};
117 std::vector<std::array<TimingStats, NSteps>> mTimingStats;
118 void addTimingStatCurStep(
int iteration,
double timeMs);
127 if (mTrkParams[iteration].PrintMemory) {
128 mMemoryPool->resetPeakMemory();
132 auto start = std::chrono::high_resolution_clock::now();
133 (this->*task)(std::forward<F>(args)...);
134 auto end = std::chrono::high_resolution_clock::now();
136 std::chrono::duration<double, std::milli> diff_t{
end -
start};
137 diff = diff_t.count();
139 std::stringstream sstream;
140 if (taskName.empty()) {
141 sstream << diff <<
"\t";
143 sstream << std::setw(2) <<
" - " << taskName <<
" completed in: " << diff <<
" ms";
145 logger(sstream.str());
147 if (mTrkParams[iteration].SaveTimeBenchmarks) {
148 std::string taskNameStr(taskName);
149 std::transform(taskNameStr.begin(), taskNameStr.end(), taskNameStr.begin(),
150 [](
unsigned char c) { return std::tolower(c); });
151 std::replace(taskNameStr.begin(), taskNameStr.end(),
' ',
'_');
152 if (std::ofstream file{
"its_time_benchmarks.txt", std::ios::app}) {
153 file <<
"trk:" << iteration <<
'\t' << taskNameStr <<
'\t' << diff <<
'\n';
155 addTimingStatCurStep(iteration, diff);
159 (this->*task)(std::forward<F>(args)...);
162 if (mTrkParams[iteration].PrintMemory) {
163 LOGP(info,
"iter:{}:{}: {}", iteration, StateNames[mCurStep], mMemoryPool->asString());
uint8_t int statusCode int