任何人都可以指出使用宽松原子操作(特别是memory_order_release
and memory_order_acquire
,而且memory_order_consume
and memory_order_relaxed
)与默认值比较 C11/C++11 代码的性能的基准测试结果memory_order_seq_cst
吗?所有架构都很有趣。提前致谢。
4 回答
我在 ARMv7 上做了一些基准测试,请参阅https://github.com/reinhrst/ARMBarriers的报告、我在 EuroLLVM 演讲的幻灯片以及我使用的 seqlock 代码。
小故事:在 seqlock 代码中,Acquire/Release 函数比顺序一致版本快 40% 左右。
这可能不是最好的解决方案,但到目前为止,我一直在使用CDSChecker在我的一个项目中进行一些基准测试。我还没有在完整的程序上使用它,但更多的是在独立的单元上使用。
对于特定的代码块(工作窃取出队),我发现了一篇非常好的 论文,它对 C11 版本的弱原子、仅使用 sc-atomics、手动优化的汇编和使用完全放松的原子的不正确版本进行了基准测试。(巧合的是,后来前面提到的 CDSChecker 在 C11 版本中发现了一个 bug。)欢迎类似的例子。
这样的问题没有意义,重要的是要理解为什么。
原子操作只是对标量对象的简单操作,只是它可以用于线程间通信;排序只影响其他内存位置的保证。
[注意:标准文本并未正式保证这一点,但它旨在保证这一点,并且 C/C++ 线程语义的一致方法必须基于此。]
您可以比较乘法和余弦的速度,但不能比较输出 "hello world" 和 flushing 的成本cout
。流或文件上的刷新没有内在的价格标签:它与其他操作有关。
您无法将在某些先前操作完成之前阻塞的操作的速度与未完成的操作的速度进行比较。
此外,您不能在真空中进行基准测试。您需要一些工作量,一种操作模式。
你需要学习很多关于现代 CPU 设计的知识,我所说的现代是指过去二十年来发明的任何东西。您必须至少对真实 CPU 的复杂性及其运行代码的方式、多核如何运行以及内存缓存的一般原则有一定的了解,才能梦想抽象地设计一个有用的基准测试。
或者,您可以编写程序并对其进行分析,以查看原子操作是否真的存在问题。