Skip to content

Commit 824e0b6

Browse files
committed
ITS: mm add tests
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent f2e0f3d commit 824e0b6

File tree

10 files changed

+283
-47
lines changed

10 files changed

+283
-47
lines changed

Detectors/ITSMFT/ITS/tracking/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,5 @@ o2_target_root_dictionary(ITStracking
5656
if(CUDA_ENABLED OR HIP_ENABLED)
5757
add_subdirectory(GPU)
5858
endif()
59+
60+
add_subdirectory(test)

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

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,14 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
6969
} while (!mUsedMemory.compare_exchange_weak(current_used, new_used,
7070
std::memory_order_acq_rel,
7171
std::memory_order_relaxed));
72-
return mUpstream->allocate(bytes, alignment);
72+
void* p{nullptr};
73+
try {
74+
p = mUpstream->allocate(bytes, alignment);
75+
} catch (...) {
76+
mUsedMemory.fetch_sub(bytes, std::memory_order_relaxed);
77+
throw;
78+
}
79+
return p;
7380
}
7481

7582
void do_deallocate(void* p, size_t bytes, size_t alignment) final
@@ -87,11 +94,12 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
8794
size_t getMaxMemory() const noexcept { return mMaxMemory; }
8895
void setMaxMemory(size_t max)
8996
{
90-
if (mUsedMemory > max) {
97+
size_t used = mUsedMemory.load(std::memory_order_acquire);
98+
if (used > max) {
9199
++mCountThrow;
92-
throw MemoryLimitExceeded(0, mUsedMemory, max);
100+
throw MemoryLimitExceeded(0, used, max);
93101
}
94-
mMaxMemory = max;
102+
mMaxMemory.store(max, std::memory_order_release);
95103
}
96104

97105
void print() const
@@ -106,7 +114,7 @@ class BoundedMemoryResource final : public std::pmr::memory_resource
106114
}
107115

108116
private:
109-
size_t mMaxMemory{std::numeric_limits<size_t>::max()};
117+
std::atomic<size_t> mMaxMemory{std::numeric_limits<size_t>::max()};
110118
std::atomic<size_t> mCountThrow{0};
111119
std::atomic<size_t> mUsedMemory{0};
112120
std::pmr::memory_resource* mUpstream;
@@ -116,66 +124,71 @@ template <typename T>
116124
using bounded_vector = std::pmr::vector<T>;
117125

118126
template <typename T>
119-
void deepVectorClear(std::vector<T>& vec)
127+
inline void deepVectorClear(std::vector<T>& vec)
120128
{
121129
std::vector<T>().swap(vec);
122130
}
123131

124132
template <typename T>
125-
inline void deepVectorClear(bounded_vector<T>& vec, BoundedMemoryResource* bmr = nullptr)
133+
inline void deepVectorClear(bounded_vector<T>& vec, std::pmr::memory_resource* mr = nullptr)
126134
{
127-
vec.~bounded_vector<T>();
128-
if (bmr == nullptr) {
129-
auto alloc = vec.get_allocator().resource();
130-
new (&vec) bounded_vector<T>(alloc);
135+
auto* res = mr ? mr : vec.get_allocator().resource();
136+
if (res == vec.get_allocator().resource()) {
137+
bounded_vector<T> empty{std::pmr::polymorphic_allocator<T>{res}};
138+
vec.swap(empty);
131139
} else {
132-
new (&vec) bounded_vector<T>(bmr);
140+
vec = bounded_vector<T>(std::pmr::polymorphic_allocator<T>{res});
133141
}
134142
}
135143

136144
template <typename T>
137-
void deepVectorClear(std::vector<bounded_vector<T>>& vec, BoundedMemoryResource* bmr = nullptr)
145+
inline void deepVectorClear(std::vector<bounded_vector<T>>& vec, std::pmr::memory_resource* mr = nullptr)
138146
{
139147
for (auto& v : vec) {
140-
deepVectorClear(v, bmr);
148+
deepVectorClear(v, mr);
141149
}
142150
}
143151

144152
template <typename T, size_t S>
145-
void deepVectorClear(std::array<bounded_vector<T>, S>& arr, BoundedMemoryResource* bmr = nullptr)
153+
inline void deepVectorClear(std::array<bounded_vector<T>, S>& arr, std::pmr::memory_resource* mr = nullptr)
146154
{
147155
for (size_t i{0}; i < S; ++i) {
148-
deepVectorClear(arr[i], bmr);
156+
deepVectorClear(arr[i], mr);
149157
}
150158
}
151159

152160
template <typename T>
153-
void clearResizeBoundedVector(bounded_vector<T>& vec, size_t size, BoundedMemoryResource* bmr, T def = T())
161+
inline void clearResizeBoundedVector(bounded_vector<T>& vec, size_t sz, std::pmr::memory_resource* mr = nullptr, T def = T())
154162
{
155-
vec.~bounded_vector<T>();
156-
new (&vec) bounded_vector<T>(size, def, bmr);
163+
auto* res = mr ? mr : vec.get_allocator().resource();
164+
if (res == vec.get_allocator().resource()) {
165+
bounded_vector<T> tmp(sz, def, std::pmr::polymorphic_allocator<T>{res});
166+
vec.swap(tmp);
167+
} else {
168+
vec = bounded_vector<T>(sz, def, std::pmr::polymorphic_allocator<T>{res});
169+
}
157170
}
158171

159172
template <typename T>
160-
void clearResizeBoundedVector(std::vector<bounded_vector<T>>& vec, size_t size, BoundedMemoryResource* bmr)
173+
void clearResizeBoundedVector(std::vector<bounded_vector<T>>& vec, size_t size, std::pmr::memory_resource* mr)
161174
{
162175
vec.clear();
163176
vec.reserve(size);
164-
for (size_t i{0}; i < size; ++i) {
165-
vec.emplace_back(bmr);
177+
for (size_t i = 0; i < size; ++i) {
178+
vec.emplace_back(std::pmr::polymorphic_allocator<bounded_vector<T>>{mr});
166179
}
167180
}
168181

169182
template <typename T, size_t S>
170-
void clearResizeBoundedArray(std::array<bounded_vector<T>, S>& arr, size_t size, BoundedMemoryResource* bmr, T def = T())
183+
inline void clearResizeBoundedArray(std::array<bounded_vector<T>, S>& arr, size_t size, std::pmr::memory_resource* mr = nullptr, T def = T())
171184
{
172185
for (size_t i{0}; i < S; ++i) {
173-
clearResizeBoundedVector(arr[i], size, bmr, def);
186+
clearResizeBoundedVector(arr[i], size, mr, def);
174187
}
175188
}
176189

177190
template <typename T>
178-
std::vector<T> toSTDVector(const bounded_vector<T>& b)
191+
inline std::vector<T> toSTDVector(const bounded_vector<T>& b)
179192
{
180193
std::vector<T> t(b.size());
181194
std::copy(b.cbegin(), b.cend(), t.begin());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ struct TimeFrame {
188188
auto getNumberOfUsedExtendedClusters() const { return mNExtendedUsedClusters; }
189189

190190
/// memory management
191-
void setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool);
191+
void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool);
192192
auto& getMemoryPool() const noexcept { return mMemoryPool; }
193193
bool checkMemory(unsigned long max) { return getArtefactsMemory() < max; }
194194
unsigned long getArtefactsMemory() const;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class Tracker
6666
const LogFunc& = [](const std::string& s) { std::cerr << s << '\n'; });
6767

6868
void setParameters(const std::vector<TrackingParameters>& p) { mTrkParams = p; }
69-
void setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool) { mMemoryPool = pool; }
69+
void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool) { mMemoryPool = pool; }
7070
std::vector<TrackingParameters>& getParameters() { return mTrkParams; }
7171
void setBz(float bz) { mTraits->setBz(bz); }
7272
bool isMatLUT() const { return mTraits->isMatLUT(); }

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class TrackerTraits
7070
bool isMatLUT() const;
7171
virtual const char* getName() const noexcept { return "CPU"; }
7272
virtual bool isGPU() const noexcept { return false; }
73-
void setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool) noexcept { mMemoryPool = pool; }
73+
void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool) noexcept { mMemoryPool = pool; }
7474
auto getMemoryPool() const noexcept { return mMemoryPool; }
7575

7676
// Others

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class Vertexer
5252
auto& getVertParameters() const { return mTraits->getVertexingParameters(); }
5353
void setParameters(const std::vector<VertexingParameters>& vertParams) { mVertParams = vertParams; }
5454
const auto& getParameters() const noexcept { return mVertParams; }
55-
void setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool) { mMemoryPool = pool; }
55+
void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool) { mMemoryPool = pool; }
5656

5757
std::vector<Vertex> exportVertices();
5858
VertexerTraitsN* getTraits() const { return mTraits; };

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class VertexerTraits
8282
virtual bool isGPU() const noexcept { return false; }
8383
virtual const char* getName() const noexcept { return "CPU"; }
8484
virtual bool usesMemoryPool() const noexcept { return true; }
85-
void setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool) { mMemoryPool = pool; }
85+
void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool) { mMemoryPool = pool; }
8686

8787
static std::pair<o2::MCCompLabel, float> computeMain(const bounded_vector<o2::MCCompLabel>& elements)
8888
{

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

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -575,36 +575,32 @@ void TimeFrame<nLayers>::printSliceInfo(const int startROF, const int sliceSize)
575575
LOG(info) << "Number of seeding vertices: " << getPrimaryVertices(iROF).size();
576576
int iVertex{0};
577577
for (auto& v : getPrimaryVertices(iROF)) {
578-
LOG(info) << "\t vertex " << iVertex++ << ": x=" << v.getX() << " " << " y=" << v.getY() << " z=" << v.getZ() << " has " << v.getNContributors() << " contributors.";
578+
LOG(info) << "\t vertex " << iVertex++ << ": x=" << v.getX() << " "
579+
<< " y=" << v.getY() << " z=" << v.getZ() << " has " << v.getNContributors() << " contributors.";
579580
}
580581
}
581582
}
582583

583584
template <int nLayers>
584-
void TimeFrame<nLayers>::setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool)
585+
void TimeFrame<nLayers>::setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool)
585586
{
586587
mMemoryPool = pool;
587588

588-
auto initVector = [&]<typename T>(bounded_vector<T>& vec) {
589-
auto alloc = vec.get_allocator().resource();
590-
if (alloc != mMemoryPool.get()) {
591-
vec = bounded_vector<T>(mMemoryPool.get());
592-
}
589+
auto initVector = [&]<typename T>(bounded_vector<T> & vec)
590+
{
591+
bounded_vector<T> tmp(std::pmr::polymorphic_allocator<T>{mMemoryPool.get()});
592+
vec.swap(tmp);
593593
};
594-
auto initArrays = [&]<typename T, size_t S>(std::array<bounded_vector<T>, S>& arr) {
594+
auto initArrays = [&]<typename T, size_t S>(std::array<bounded_vector<T>, S> & arr)
595+
{
595596
for (size_t i{0}; i < S; ++i) {
596-
auto alloc = arr[i].get_allocator().resource();
597-
if (alloc != mMemoryPool.get()) {
598-
arr[i] = bounded_vector<T>(mMemoryPool.get());
599-
}
597+
initVector(arr[i]);
600598
}
601599
};
602-
auto initVectors = [&]<typename T>(std::vector<bounded_vector<T>>& vec) {
600+
auto initVectors = [&]<typename T>(std::vector<bounded_vector<T>> & vec)
601+
{
603602
for (size_t i{0}; i < vec.size(); ++i) {
604-
auto alloc = vec[i].get_allocator().resource();
605-
if (alloc != mMemoryPool.get()) {
606-
vec[i] = bounded_vector<T>(mMemoryPool.get());
607-
}
603+
initVector(vec[i]);
608604
}
609605
};
610606

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
# All rights not expressly granted are reserved.
4+
#
5+
# This software is distributed under the terms of the GNU General Public
6+
# License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
#
8+
# In applying this license CERN does not waive the privileges and immunities
9+
# granted to it by virtue of its status as an Intergovernmental Organization
10+
# or submit itself to any jurisdiction.
11+
12+
o2_add_test(boundedmemoryresource
13+
SOURCES testBoundedMemoryResource.cxx
14+
COMPONENT_NAME its-tracking
15+
LABELS "its;tracking"
16+
PUBLIC_LINK_LIBRARIES O2::ITStracking)

0 commit comments

Comments
 (0)