1

GCC のアトミック ビルトインを使用して shared をインクリメントしていvolatile intます。私がやりたいのは値をインクリメントすることだけで、戻り値は気にしません。私はこれを好むべきですか、fetch_and_addそれともadd_and_fetchこれを好むべきですか?ドキュメントには、一方が他方よりもパフォーマンス上の利点があることを示唆するものは何もありません。それは本当に問題ではありませんか?

または、実際に値をアトミックに読み取る必要がないためvolatile int、戻り値を実際に読み取らないため、 a をインクリメントするより良い方法はありますか?

これは明らかにアーキテクチャに依存するため、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)

これは、2 つの組み込み関数が同じアセンブラー コードに変換されていることを示しています (ここでは Intel x64 の場合)。

-march=native および/または -O3 またはお気に入りのオプションで試して、常に同じかどうかを確認することもできます...

于 2013-09-02T09:17:30.950 に答える