Spaces:
Build error
Build error
/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
==============================================================================*/ | |
namespace tensorflow { | |
void AllocatorStats::Clear() { | |
this->num_allocs = 0; | |
this->bytes_in_use = 0; | |
this->max_bytes_in_use = 0; | |
this->max_alloc_size = 0; | |
this->bytes_limit = 0; | |
} | |
string AllocatorStats::DebugString() const { | |
return strings::Printf( | |
"Limit: %20lld\n" | |
"InUse: %20lld\n" | |
"MaxInUse: %20lld\n" | |
"NumAllocs: %20lld\n" | |
"MaxAllocSize: %20lld\n", | |
this->bytes_limit, this->bytes_in_use, this->max_bytes_in_use, | |
this->num_allocs, this->max_alloc_size); | |
} | |
constexpr size_t Allocator::kAllocatorAlignment; | |
Allocator::~Allocator() {} | |
void RunResourceCtor(ResourceHandle* p, size_t n) { | |
for (size_t i = 0; i < n; ++p, ++i) new (p) ResourceHandle(); | |
} | |
void RunResourceDtor(ResourceHandle* p, size_t n) { | |
for (size_t i = 0; i < n; ++p, ++i) p->~ResourceHandle(); | |
} | |
// If true, cpu allocator collects more stats. | |
static bool cpu_allocator_collect_stats = false; | |
// If true, cpu allocator collects full stats. | |
static bool cpu_allocator_collect_full_stats = false; | |
void EnableCPUAllocatorStats(bool enable) { | |
cpu_allocator_collect_stats = enable; | |
} | |
void EnableCPUAllocatorFullStats(bool enable) { | |
cpu_allocator_collect_full_stats = enable; | |
} | |
class CPUAllocator : public Allocator { | |
public: | |
CPUAllocator() {} | |
~CPUAllocator() override {} | |
string Name() override { return "cpu"; } | |
void* AllocateRaw(size_t alignment, size_t num_bytes) override { | |
void* p = port::AlignedMalloc(num_bytes, alignment); | |
if (cpu_allocator_collect_stats) { | |
const std::size_t alloc_size = port::MallocExtension_GetAllocatedSize(p); | |
mutex_lock l(mu_); | |
++stats_.num_allocs; | |
stats_.bytes_in_use += alloc_size; | |
stats_.max_bytes_in_use = | |
std::max<int64>(stats_.max_bytes_in_use, stats_.bytes_in_use); | |
stats_.max_alloc_size = | |
std::max<int64>(stats_.max_alloc_size, alloc_size); | |
} | |
return p; | |
} | |
void DeallocateRaw(void* ptr) override { | |
if (cpu_allocator_collect_stats) { | |
const std::size_t alloc_size = | |
port::MallocExtension_GetAllocatedSize(ptr); | |
mutex_lock l(mu_); | |
stats_.bytes_in_use -= alloc_size; | |
} | |
port::AlignedFree(ptr); | |
} | |
void GetStats(AllocatorStats* stats) override { | |
mutex_lock l(mu_); | |
*stats = stats_; | |
} | |
size_t AllocatedSizeSlow(void* ptr) override { | |
return port::MallocExtension_GetAllocatedSize(ptr); | |
} | |
private: | |
mutex mu_; | |
AllocatorStats stats_ GUARDED_BY(mu_); | |
TF_DISALLOW_COPY_AND_ASSIGN(CPUAllocator); | |
}; | |
Allocator* cpu_allocator() { | |
static Allocator* cpu_alloc = AllocatorRegistry::Global()->GetAllocator(); | |
if (cpu_allocator_collect_full_stats && !cpu_alloc->TracksAllocationSizes()) { | |
cpu_alloc = new TrackingAllocator(cpu_alloc, true); | |
} | |
return cpu_alloc; | |
} | |
REGISTER_MEM_ALLOCATOR("DefaultCPUAllocator", 100, CPUAllocator); | |
} // namespace tensorflow | |