#include "common/memory_tracking.hpp"
#include "common/engine.hpp"
#include "common/scratchpad_debug.hpp"
namespace dnnl {
namespace impl {
namespace memory_tracking {
const void *registry_t::entry_t::compute_ptr(const void *base_ptr) const {
if (size == 0) return nullptr;
assert(base_ptr != nullptr);
char *ptr = (char *)base_ptr + offset;
char *aligned_ptr = utils::align_ptr<char>(ptr, get_alignment(alignment));
if (memory_debug::is_mem_debug_overflow() && size % getpagesize() != 0) {
size_t page_end_offset = utils::rnd_up(size, alignment) % getpagesize();
aligned_ptr += getpagesize() - page_end_offset;
if (aligned_ptr - getpagesize() > ptr) aligned_ptr -= getpagesize();
assert((size_t)aligned_ptr % alignment == 0);
}
assert(aligned_ptr + size <= ptr + capacity - buffer_protect_size());
return (const void *)aligned_ptr;
}
grantor_t *registry_t::create_grantor(const memory_storage_t *mem_storage,
const void *base_mem_storage_host_ptr) const {
assert(IMPLICATION(!mem_storage, !base_mem_storage_host_ptr));
return new grantor_t(*this, mem_storage, base_mem_storage_host_ptr,
false);
}
grantor_t::grantor_t(const registry_t ®istry,
const memory_storage_t *base_mem_storage,
const void *base_mem_storage_host_ptr, bool take_storage_ownership)
: registry_(registry)
, prefix_(0)
, base_mem_storage_(base_mem_storage,
[&, take_storage_ownership](const memory_storage_t *ms) {
#if defined(DNNL_ENABLE_MEM_DEBUG)
if (scratchpad_debug::is_protect_scratchpad()) {
scratchpad_debug::unprotect_scratchpad_buffer(
get_base_storage(), get_registry());
}
#endif
if (take_storage_ownership) delete ms;
})
, base_mem_storage_host_ptr_(base_mem_storage_host_ptr) {
#ifdef DNNL_ENABLE_MEM_DEBUG
if (scratchpad_debug::is_protect_scratchpad()) {
scratchpad_debug::protect_scratchpad_buffer(
get_base_storage(), get_registry());
}
#endif
}
grantor_t::grantor_t(const grantor_t &parent, const key_t &prefix)
: registry_(parent.registry_)
, prefix_(make_prefix(parent.prefix_, prefix))
, base_mem_storage_(parent.base_mem_storage_)
, base_mem_storage_host_ptr_(parent.base_mem_storage_host_ptr_) {}
char *grantor_t::host_ptr(const memory_storage_t *mem_storage) const {
if (!mem_storage || mem_storage->is_null()) return nullptr;
void *handle = mem_storage->root_storage()->data_handle();
char *base_ptr = nullptr;
if (base_mem_storage_host_ptr_) {
base_ptr = reinterpret_cast<char *>(
const_cast<void *>(base_mem_storage_host_ptr_))
+ mem_storage->base_offset();
} else {
assert(mem_storage->is_host_accessible());
base_ptr = static_cast<char *>(handle);
}
return base_ptr;
}
bool grantor_t::is_cpu_engine(const memory_storage_t *mem_storage) const {
if (!mem_storage) return false;
auto engine = mem_storage->engine();
assert(engine);
if (engine->kind() == engine_kind::cpu) return true;
return false;
}
grantor_t *create_nested_grantor(const grantor_t &master_grantor, int key,
const registry_t &nested_registry) {
return new grantor_t(nested_registry,
master_grantor.get_memory_storage(key).release(),
master_grantor.get_base_mem_storage_host_ptr(),
true);
}
} } }