原子RMW操作和函数调用的比较成本是多少?

时间:2014-02-25 05:16:49

标签: c++ performance stdatomic

我的理解是原子机器指令可能比非原子操作慢两个数量级。例如,给定

int x;
x++

std::atomic<int> y;
y++;

我的理解是x++的运行速度通常比y++快得多。 (我假设增量操作映射到底层机器指令。我确信确切的比较成本因架构而异,但我说的是经验法则。)

我对原子RMW操作和非内联函数调用的相对成本感兴趣,这也是一般的经验法则。例如,给定此非内联函数,

void f(){}

我们通常可以说y++的成本(即原子增量)与执行f的非内联调用的成本相比?

我的动机是试图将“原子操作比非原子操作昂贵得多”的共同主张放在视角中。一种方法是尝试了解原子RMW操作与调用和从非内联函数返回的成本有多高。

请不要回答“只知道测量的唯一方法”。我不是在询问特定体系结构中特定上下文中的原子RMW操作与函数调用。我问的是一般的经验法则可以作为讨论的基础,对于那些可能会认为“我们永远不会使用原子指令,因为它们太昂贵了”的人来说,但他们不会再三思而后行函数调用。

1 个答案:

答案 0 :(得分:-1)

所问的问题有问题。

一个是您使用的伪代码语法没有明确的存储类,并且似乎可以在本地对象上运行。局部原子对象是没有意义的。原子操作用于不同线程共享的对象。

编译器很可能会注意到,非易失性局部变量仅在函数中使用,并且不会生成任何特殊的原子操作(我不知道目前有这样做的编译器)。

我们必须假定该对象不是本地对象(或易失对象)。

任何内存操作的成本在很大程度上取决于 缓存。如果该位置不在我们的缓存中,则该操作的成本将大大提高。

堆栈的所有结尾(最近的部分)几乎总是在我们的缓存中。

根据定义,共享对象的值必须在缓存之间传播(它们被多个线程修改或读取)。

那么您在这里真正比较什么?除非您准确地说出问题,否则无法回答。

相关问题