RingBuffer Class — pytorch Architecture
Architecture documentation for the RingBuffer class in CUDACachingAllocator.cpp from the pytorch codebase.
Entity Profile
Source Code
c10/cuda/CUDACachingAllocator.cpp lines 1068–1124
template <class T>
class RingBuffer {
public:
RingBuffer() {
// alloc_trace is a pointer because we need to intentionally
// leak this on deallocation it can hold references to Python
// state which will already be destroyed when we are in exit handlers
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
alloc_trace = new std::vector<T>();
}
void setMaxEntries(size_t size) {
std::lock_guard<std::mutex> lk(alloc_trace_lock);
alloc_trace_max_entries_ = std::max(static_cast<size_t>(1), size);
}
void insertEntries(const T& entry) {
std::lock_guard<std::mutex> lk(alloc_trace_lock);
if (alloc_trace->size() < alloc_trace_max_entries_) {
alloc_trace->emplace_back(entry);
} else {
(*alloc_trace)[alloc_trace_next++] = entry;
if (alloc_trace_next == alloc_trace_max_entries_) {
alloc_trace_next = 0;
}
}
}
void getEntries(std::vector<T>& result) const {
std::lock_guard<std::mutex> lk(alloc_trace_lock);
result.reserve(result.size() + alloc_trace->size());
std::rotate_copy(
alloc_trace->begin(),
std::next(alloc_trace->begin(), alloc_trace_next),
alloc_trace->end(),
std::back_inserter(result));
}
void clear() {
std::lock_guard<std::mutex> lk(alloc_trace_lock);
alloc_trace_next = 0;
alloc_trace->clear();
alloc_trace->shrink_to_fit();
}
private:
size_t alloc_trace_max_entries_ = 1;
// Both alloc_trace and alloc_trace_next needs to be used
// under alloc_trace_lock.
mutable std::mutex alloc_trace_lock;
size_t alloc_trace_next = 0;
std::vector<T>*
alloc_trace; // pointer because we need to intentionally leak this on
// deallocation it can hold references to Python state which
// will already be destroyed when we are in exit handlers
};
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free