gpt4 book ai didi

c++ - std::atomic 与非原子变量的性能如何?

转载 作者:行者123 更新时间:2023-11-27 22:37:54 31 4
gpt4 key购买 nike

我很好奇使用 std::atomic<float> 的性能与正常 float 相比在应用程序中。我也很好奇是什么影响了这一点。我经常看到有关原子与互斥体性能的主题,但我发现很难找到有关原子与非原子的信息。

我并不是用它来选择让我的代码线程安全与否,只是想了解所涉及的开销。

(编辑:在原始问题的这一点上,我给出了一个示例(见下文),该示例应该说明实现的更改,而不是询问有关该代码的具体问题。这似乎使人们感到困惑关于我问的问题,所以我把它拿出来了。)

我基本上想知道影响 std::atomic 性能的主要因素有哪些。是平台吗?它们的使用方式?使用两个线程访问大致相同数量的原子是否比一个线程 95% 的时间访问它们而另一个线程仅偶尔访问它们更慢?

此外,std::atomic<int> 之间有什么区别吗?和一个 std::atomic<float>在这方面?

提前致谢

亚当


原始问题的示例:

基本上,我尝试制作一百万个 float 并向它们写入值 200 次。这对我来说花了 0.87 秒。一旦我将它们更改为 std::atomic<float> ,这大约需要 2.5 秒。所以这意味着使用 std::atomic<float> 的成本大约是其 3 倍.

我试过这个但是为了读取值而不是写入值,发现一个正常的 floatstd::atomic<float>花费相同的时间。

但这会受到其他因素的影响吗?如果另一个线程正在写入/读取我的原子,这会减慢其他对同一变量的读取/写入速度吗?大概是这样,但我怎样才能更好地理解这一点?

最佳答案

没有排序参数(即默认参数)的原子存储是昂贵的,因为编译器会发出额外的排序指令。在 X86 ,一个默认的(顺序一致的)原子存储到一个 float 看起来像这样:

atomic<float> f;
f.store(3.14);

gcc 生成以下指令:

0x00000000004006d0 <+0>:     movl   $0x4048f5c3,0x20096a(%rip)        # 0x601044 <f>
0x00000000004006da <+10>: mfence

mence指令很昂贵,因为它确保对其他内核的直接可见性(即导致存储缓冲区被刷新)。

您可以尝试在不订购的情况下运行测试:

f.store(3.14, std::memory_order_relaxed);

这将摆脱 mfence并且可能表现出显着的性能差异。它更接近于非原子存储,如果在某些平台上不相等的话。

is there any difference between a std::atomic<int> and a std::atomic<float> in this regard?

假设两者都是无锁的,可能不是。排序约束是导致性能下降的原因。

关于c++ - std::atomic 与非原子变量的性能如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51846894/

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