gpt4 book ai didi

c++ - 原子操作比锁定花费的时间更长(无争用)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:45 24 4
gpt4 key购买 nike

我正在尝试测量没有争用时各种同步选项的开销。我使用以下程序:

#include <atomic>
#include <chrono>
#include <iostream>
#include <mutex>

void function() {
static volatile uint64_t counter = 0;
counter++;
}

void function2() {
std::atomic<uint64_t> counter2 = 0;
counter2++;
}

int main() {
// warm up the cache
std::mutex lock;
for( int i=0; i<1'000'000; ++i ) {
std::lock_guard<std::mutex> locker(lock);
function();
function2();
}

std::cout<<"Starting test\n";
auto start = std::chrono::high_resolution_clock::now();
for( int i=0; i<1'000'000; ++i ) {
std::lock_guard<std::mutex> locker(lock);
function();
}
auto end = std::chrono::high_resolution_clock::now();
std::cout<<" With lock took "<<std::chrono::ceil<std::chrono::nanoseconds>(end-start).count()<<"ns\n";

start = std::chrono::high_resolution_clock::now();
for( int i=0; i<1'000'000; ++i ) {
function();
}
end = std::chrono::high_resolution_clock::now();
std::cout<<" No lock took "<<std::chrono::ceil<std::chrono::nanoseconds>(end-start).count()<<"ns\n";

start = std::chrono::high_resolution_clock::now();
for( int i=0; i<1'000'000; ++i ) {
function2();
}
end = std::chrono::high_resolution_clock::now();
std::cout<<"Atomic lock took "<<std::chrono::ceil<std::chrono::nanoseconds>(end-start).count()<<"ns\n";
}

用 gcc 或 clang 编译,我得到类似的结果:

$ clang++-7 -g -O3 -std=c++2a locking.cpp -o locking && ./locking 
Starting test
With lock took 2099204ns
No lock took 2126724ns
Atomic lock took 12922543ns

因此,使用或不使用锁定的结果非常相似(通常不使用锁定的速度稍微更快),但是对于原子操作,我获得了 x6 的性能损失。

从逻辑上讲,如果没有争用,相关变量将全部位于正在运行的 CPU 缓存的本地,并且所有同步选项都会或多或少地产生相同的性能。

我错过了什么?

最佳答案

问题出在基准程序上。

首先是 std::atomic 没有被声明为 static,导致每次迭代都使用一个新的。第二个问题是程序没有用-pthread编译,导致加锁的代码变成了no-op(这也解释了为什么带锁的代码运行速度和不加锁的一样)。

解决这两个问题会产生:

Starting test
With lock took 21013047ns
No lock took 2125868ns
Atomic lock took 6744567ns

所以原子方法比没有锁定慢大约 3 倍,而实际锁定大约慢 10 倍。

关于c++ - 原子操作比锁定花费的时间更长(无争用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com