1

我正在使用GCC 的 atomic builtins来增加共享的volatile int. 我想做的只是增加值,而不关心返回值。我应该更喜欢fetch_and_add还是add_and_fetch为此?我在文档中没有看到任何内容表明其中一个会比另一个具有性能优势。真的没关系吗?

或者,由于我实际上不需要以原子方式读取值,是否有更好的方法来增加 a ,volatile int因为我实际上并没有读取返回值?

这显然取决于架构,因此您可以假设我使用的是 x64。如果有什么不同,我会专门使用 AMD Opteron CPU。

4

1 回答 1

2

这取决于您的硬件、变量的大小、增量值和编译器选项。

要检查它,请将一个小 C 程序翻译成汇编。

volatile int init;
void foo(void) {
    __sync_fetch_and_add(&init,1);
    __sync_add_and_fetch(&init,1);
}

用 'gcc -S xc' 翻译成一个文件 xs 在 xs 中最有趣的是

    lock addl       $1, init(%rip)
    lock addl       $1, init(%rip)

这表明这两个内在函数被翻译成相同的汇编代码(这里在 Intel x64 上)。

您也可以尝试使用 -march=native 和/或 -O3 或您最喜欢的选项,看看它是否总是一样...

于 2013-09-02T09:17:30.950 回答