我的理解是,原子机器指令可能比非原子操作慢两个数量级。例如,给定
int x;
x++
和
std::atomic<int> y;
y++;
我的理解是CCD_ 1通常比CCD_。(我假设增量操作映射到底层机器指令。我确信不同架构的确切比较成本不同,但我说的是经验法则。)
我对原子RMW操作和非内联函数调用的相对成本很感兴趣,这也是一条经验法则。例如,给定这个非内联函数,
void f(){}
与执行对f
的非内联调用的成本相比,我们通常可以说y++
的成本(即原子增量)是多少?
我的动机是试图正确看待"原子操作比非原子操作贵得多"这一常见说法。一种方法是尝试了解与从非内联函数调用和返回相比,原子RMW操作的成本有多高。
请不要回答"唯一知道的方法是测量"。我不是在问原子RMW操作与特定架构上特定上下文中的函数调用之间的关系。我想问的是一个通用的经验法则,它可以作为那些可能认为"我们永远不能使用原子指令,因为它们太贵了"但在进行函数调用时不会三思而后行的人的讨论基础。
所问的问题有问题。
一种是使用伪代码语法,该语法没有明确的存储类,并且似乎对本地对象进行操作。局部原子对象是没有意义的。原子操作用于不同线程共享的对象。
编译器很可能会注意到,非易失性局部变量只用于函数,而不会生成任何特殊的原子操作(我不知道目前有哪个编译器会这样做)。
我们必须假设对象不是本地的(或者是易失性的)。
任何内存操作的成本在很大程度上取决于缓存。如果该位置不在我们的缓存中,操作成本将高得多。
所有的栈尾(最近的部分)几乎总是在我们的缓存中。
根据定义,共享对象的值必须在缓存之间传输(它们由多个线程修改或读取)。
那么,你在这里真正比较的是什么呢?除非你说得准确,否则这个问题是无法回答的。