gpt4 book ai didi

c++ - .load(std::memory_order_relaxed) 的成本是否与读取非原子变量相同?

转载 作者:太空宇宙 更新时间:2023-11-04 13:31:40 26 4
gpt4 key购买 nike

我有 64 位,我需要在事件发生前非常快速地读取它,然后在事件发生后执行比较和交换。

我想我可以在事件发生前加载(std::memory_order_relaxed)以快速阅读,然后在事件发生后使用常规比较和交换。

当我比较非原子 64 位读取、原子(松弛)和原子(获取)之间的程序集时,我看不出程序集中有任何差异。这是 C++ 测试:

int main(){
volatile uint64_t var2;
std::atomic<uint64_t> var; // The variable I wish to read quickly
var = 10;

var2 = var.load(std::memory_order_relaxed);
//var2 = var; // when var is not atomic
//var2 = var.load(std::memory_order_acquire); To see if the x86 changed
}

给出这个程序集:

!int main(){
main()+0: sub $0x48,%rsp
main()+4: callq 0x100401180 <__main>
! volatile uint64_t var2;
! volatile std::atomic<uint64_t> var;
! var = 10;
!
!
! var2 = var.load(std::memory_order_acquire);
main()()
main()+26: mov %rax,0x38(%rsp)
!
! int x;
! std::cin >> x;
main()+31: lea 0x2c(%rsp),%rdx
main()+36: mov 0x1f45(%rip),%rcx # 0x100403050 <__fu0__ZSt3cin>
main()+43: callq 0x100401160 <_ZNSirsERi>
!}main()+48: mov $0x0,%eax
main()+53: add $0x48,%rsp
main()+57: retq

显然是使用 std::memory_order_acquire 的程序集应该不同于非原子变量读取?

这是因为无论如何读取 64 位都是原子的,只要数据对齐,因此程序集没有区别吗?我本以为使用更强的内存屏障会插入栅栏指令或其他东西?

我想知道的真正问题是,如果我将 64 位声明为原子变量并使用宽松的内存屏障读取,它的性能成本是否与读取非原子 64 位变量相同?

最佳答案

if I declare the 64 bits as atomic and I read using a relaxed memory barrier, will it have the same performance cost as reading an unatomic 64-bit variable?

是的,它们在内存屏障/栅栏方面具有相同的成本。

在 x86_64 上,每个负载都有 aqcuire 语义,因此从处理器的角度来看,具有获取语义的负载与具有宽松语义的负载相同。但它们从编译器的角度来看是不同的(宽松的操作可以与其他操作重新排序)。

关于c++ - .load(std::memory_order_relaxed) 的成本是否与读取非原子变量相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214983/

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