以下のコードは、マルチスレッドプログラミングの好奇心を示しています。特に、std::memory_order_relaxed
のパフォーマンスは、単一のスレッドで通常の増分と比較して増加します。 fetch_add(relaxed)シングルスレッドの方が通常のインクリメントよりも2倍遅いのはなぜ分かりませんか?アトミックfetch_addとパフォーマンスの追加
static void BM_IncrementCounterLocal(benchmark::State& state) {
volatile std::atomic_int val2;
while (state.KeepRunning()) {
for (int i = 0; i < 10; ++i) {
DoNotOptimize(val2.fetch_add(1, std::memory_order_relaxed));
}
}
}
BENCHMARK(BM_IncrementCounterLocal)->ThreadRange(1, 8);
static void BM_IncrementCounterLocalInt(benchmark::State& state) {
volatile int val3 = 0;
while (state.KeepRunning()) {
for (int i = 0; i < 10; ++i) {
DoNotOptimize(++val3);
}
}
}
BENCHMARK(BM_IncrementCounterLocalInt)->ThreadRange(1, 8);
出力:
Benchmark Time(ns) CPU(ns) Iterations ---------------------------------------------------------------------- BM_IncrementCounterLocal/threads:1 59 60 11402509 BM_IncrementCounterLocal/threads:2 30 61 11284498 BM_IncrementCounterLocal/threads:4 19 62 11373100 BM_IncrementCounterLocal/threads:8 17 62 10491608 BM_IncrementCounterLocalInt/threads:1 31 31 22592452 BM_IncrementCounterLocalInt/threads:2 15 31 22170842 BM_IncrementCounterLocalInt/threads:4 8 31 22214640 BM_IncrementCounterLocalInt/threads:8 9 31 21889704
マシンコードを比較しましたか? –
シングルスレッドモードであることをコンパイラーに伝える必要があります。 –
'memory_order_relaxed'が何かするシステムにいますか? x86ではそうではありません。 'fetch_add'は追加操作をアトミックにするためにバスロックを発行するでしょう。 'operator ++'はそれをする必要はありません。 –