You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mindspore/predict/src/runtime/allocator.cc

136 lines
3.1 KiB

/**
* Copyright 2019 Huawei Technologies Co., Ltd
*
* 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.
*/
#include "src/runtime/allocator.h"
#include "common/module_registry.h"
#include "src/op_common.h"
namespace mindspore {
namespace predict {
std::shared_ptr<Allocator> Allocator::Create() {
auto alloc = GetRegistryInstance()->Create<Allocator>(MODULE_REG_NAME_ALLOCATOR);
if (alloc != nullptr) {
return alloc;
}
// default allocator
return std::shared_ptr<Allocator>(new DefaultAllocator());
}
DefaultAllocator::DefaultAllocator() = default;
DefaultAllocator::~DefaultAllocator() { Clear(); }
void DefaultAllocator::SetContext(const AllocatorContext &ctx) {
lockFlag = ctx.lockFlag;
shiftFactor = ctx.shiftFactor;
}
void DefaultAllocator::Lock() {
if (lockFlag) {
lock.lock();
}
}
void DefaultAllocator::UnLock() {
if (lockFlag) {
lock.unlock();
}
}
void *DefaultAllocator::Malloc(size_t size) {
if (size > MAX_MALLOC_SIZE) {
return nullptr;
}
Lock();
auto it = freeList.begin();
for (; it != freeList.end(); it++) {
auto membuf = *it;
if ((membuf->size >= size) && (membuf->size < (size << shiftFactor))) {
freeList.erase(it);
allocatedList.push_back(membuf);
UnLock();
return membuf->buf;
}
}
std::unique_ptr<MemBuf> membuf(reinterpret_cast<MemBuf *>(malloc(sizeof(MemBuf) + size)));
if (membuf == nullptr) {
UnLock();
return nullptr;
}
membuf->size = size;
membuf->buf = reinterpret_cast<char *>(membuf.get()) + sizeof(MemBuf);
auto bufPtr = membuf->buf;
allocatedList.push_back(membuf.release());
UnLock();
return bufPtr;
}
void DefaultAllocator::Free(void *buf) {
if (buf == nullptr) {
return;
}
Lock();
auto it = allocatedList.begin();
for (; it != allocatedList.end(); it++) {
auto membuf = *it;
if (membuf->buf == buf) {
allocatedList.erase(it);
freeList.push_back(membuf);
UnLock();
return;
}
}
UnLock();
free(buf);
}
size_t DefaultAllocator::GetTotalSize() {
Lock();
size_t totalSize = 0;
auto it = allocatedList.begin();
for (; it != allocatedList.end(); it++) {
auto membuf = *it;
totalSize += membuf->size;
}
it = freeList.begin();
for (; it != freeList.end(); it++) {
auto membuf = *it;
totalSize += membuf->size;
}
UnLock();
return totalSize;
}
void DefaultAllocator::Clear() {
Lock();
auto it = allocatedList.begin();
for (; it != allocatedList.end(); it++) {
free(*it);
}
allocatedList.clear();
it = freeList.begin();
for (; it != freeList.end(); it++) {
free(*it);
}
freeList.clear();
UnLock();
}
} // namespace predict
} // namespace mindspore