未验证 提交 0efda9d9 编写于 作者: W wanghuancoder 提交者: GitHub

use spinlock in auto growth (#35139)

* use spinlock in auto growth, test=develop

* refine,test=develop
上级 b3ef9a68
......@@ -45,7 +45,7 @@ AutoGrowthBestFitAllocator::AutoGrowthBestFitAllocator(
Allocation *AutoGrowthBestFitAllocator::AllocateImpl(size_t size) {
size = AlignedSize(size, alignment_);
std::lock_guard<std::mutex> guard(mtx_);
std::lock_guard<SpinLock> guard(spinlock_);
auto iter = free_blocks_.lower_bound(std::make_pair(size, nullptr));
BlockIt block_it;
if (iter != free_blocks_.end()) {
......@@ -98,7 +98,7 @@ Allocation *AutoGrowthBestFitAllocator::AllocateImpl(size_t size) {
}
void AutoGrowthBestFitAllocator::FreeImpl(Allocation *allocation) {
std::lock_guard<std::mutex> guard(mtx_);
std::lock_guard<SpinLock> guard(spinlock_);
auto block_it = static_cast<BlockAllocation *>(allocation)->block_it_;
auto &blocks = block_it->chunk_->blocks_;
......
......@@ -21,6 +21,7 @@
#include <utility>
#include "paddle/fluid/memory/allocation/allocator.h"
#include "paddle/fluid/memory/allocation/spin_lock.h"
namespace paddle {
namespace memory {
......@@ -86,7 +87,7 @@ class AutoGrowthBestFitAllocator : public Allocator {
size_t alignment_;
size_t chunk_size_;
mutable std::mutex mtx_;
SpinLock spinlock_;
};
} // namespace allocation
......
// Copyright (c) 2021 PaddlePaddle 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.
#pragma once
#include <atomic>
#if !defined(_WIN32)
#include <sched.h>
#else
#include <windows.h>
#endif // !_WIN32
namespace paddle {
namespace memory {
class SpinLock {
public:
SpinLock() : mlock_(false) {}
void lock() {
bool expect = false;
uint64_t spin_cnt = 0;
while (!mlock_.compare_exchange_weak(expect, true)) {
expect = false;
if ((++spin_cnt & 0xFF) == 0) {
#if defined(_WIN32)
SleepEx(50, FALSE);
#else
sched_yield();
#endif
}
}
}
void unlock() { mlock_.store(false); }
DISABLE_COPY_AND_ASSIGN(SpinLock);
private:
std::atomic<bool> mlock_;
};
} // namespace memory
} // namespace paddle
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册