Skip to content

Commit ac8945b

Browse files
committed
ITS: add per-stage memory stat
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 94d9198 commit ac8945b

3 files changed

Lines changed: 40 additions & 5 deletions

File tree

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

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,16 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
9292
throw;
9393
}
9494

95-
#ifdef BOUNDED_MR_STATS
96-
size_t peak = mStats.peak.load(std::memory_order_relaxed);
95+
size_t peak = mPeakUsedMemory.load(std::memory_order_relaxed);
9796
while (new_used > peak &&
98-
!mStats.peak.compare_exchange_weak(peak, new_used,
97+
!mPeakUsedMemory.compare_exchange_weak(peak, new_used,
98+
std::memory_order_relaxed)) {
99+
}
100+
101+
#ifdef BOUNDED_MR_STATS
102+
size_t statsPeak = mStats.peak.load(std::memory_order_relaxed);
103+
while (new_used > statsPeak &&
104+
!mStats.peak.compare_exchange_weak(statsPeak, new_used,
99105
std::memory_order_relaxed)) {
100106
}
101107
mStats.live.fetch_add(1, std::memory_order_relaxed);
@@ -137,6 +143,23 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
137143
{
138144
return mCountThrow.load(std::memory_order_relaxed);
139145
}
146+
[[nodiscard]] size_t getPeakMemory() const noexcept
147+
{
148+
return mPeakUsedMemory.load(std::memory_order_relaxed);
149+
}
150+
[[nodiscard]] size_t getPeakMemoryDelta() const noexcept
151+
{
152+
const size_t peak = mPeakUsedMemory.load(std::memory_order_relaxed);
153+
const size_t baseline = mPeakBaselineMemory.load(std::memory_order_relaxed);
154+
return peak > baseline ? peak - baseline : 0;
155+
}
156+
157+
void resetPeakMemory() noexcept
158+
{
159+
const size_t used = mUsedMemory.load(std::memory_order_acquire);
160+
mPeakBaselineMemory.store(used, std::memory_order_release);
161+
mPeakUsedMemory.store(used, std::memory_order_release);
162+
}
140163

141164
void setMaxMemory(size_t max)
142165
{
@@ -166,12 +189,14 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
166189
{
167190
const auto throw_ = mCountThrow.load(std::memory_order_relaxed);
168191
const auto used = static_cast<double>(mUsedMemory.load(std::memory_order_relaxed));
192+
const auto peak = static_cast<double>(mPeakUsedMemory.load(std::memory_order_relaxed));
193+
const auto peakDelta = static_cast<double>(getPeakMemoryDelta());
169194
const auto maxm = mMaxMemory.load(std::memory_order_relaxed);
170195
std::string ret;
171196
if (maxm == std::numeric_limits<size_t>::max()) {
172-
ret += std::format("maxthrow={} maxmem=unbounded used={:.2f} GB", throw_, used / constants::GB);
197+
ret += std::format("maxthrow={} maxmem=unbounded used={:.2f} GB stagepeak={:.2f} GB stagealloc={:.2f} GB", throw_, used / constants::GB, peak / constants::GB, peakDelta / constants::GB);
173198
} else {
174-
ret += std::format("maxthrow={} maxmem={:.2f} GB used={:.2f} GB ({:.2f}%)", throw_, (double)maxm / constants::GB, used / constants::GB, 100.0 * used / (double)maxm);
199+
ret += std::format("maxthrow={} maxmem={:.2f} GB used={:.2f} GB ({:.2f}%) stagepeak={:.2f} GB stagealloc={:.2f} GB", throw_, (double)maxm / constants::GB, used / constants::GB, 100.0 * used / (double)maxm, peak / constants::GB, peakDelta / constants::GB);
175200
}
176201
#ifdef BOUNDED_MR_STATS
177202
ret += std::format(" peak={:.2f} GB live={} nAlloc={} nFree={} totalAlloc={:.2f} GB totalFreed={:.2f} GB maxAlign={} upstreamFail={}",
@@ -197,6 +222,8 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
197222
std::atomic<size_t> mMaxMemory{std::numeric_limits<size_t>::max()};
198223
std::atomic<size_t> mCountThrow{0};
199224
std::atomic<size_t> mUsedMemory{0};
225+
std::atomic<size_t> mPeakUsedMemory{0};
226+
std::atomic<size_t> mPeakBaselineMemory{0};
200227
std::unique_ptr<ExternalAllocatorAdaptor> mAdaptor{nullptr};
201228
std::pmr::memory_resource* mUpstream{nullptr};
202229

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ float Tracker<NLayers>::evaluateTask(void (Tracker<NLayers>::*task)(T...), std::
114114
{
115115
float diff{0.f};
116116

117+
if (mTrkParams[iteration].PrintMemory) {
118+
mMemoryPool->resetPeakMemory();
119+
}
120+
117121
if constexpr (constants::DoTimeBenchmarks) {
118122
auto start = std::chrono::high_resolution_clock::now();
119123
(this->*task)(std::forward<F>(args)...);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ float Vertexer<NLayers>::evaluateTask(void (Vertexer<NLayers>::*task)(T...), std
126126
{
127127
float diff{0.f};
128128

129+
if (mVertParams[iteration].PrintMemory) {
130+
mMemoryPool->resetPeakMemory();
131+
}
132+
129133
if constexpr (constants::DoTimeBenchmarks) {
130134
auto start = std::chrono::high_resolution_clock::now();
131135
(this->*task)(std::forward<T>(args)...);

0 commit comments

Comments
 (0)