私は大規模な科学アプリケーションのベンチマークを行っていましたが、同じ入力でも実行速度が 10% 遅くなることがありました。よく調べた結果、私のクアッド コア CPU (具体的には、2.4 GHz で動作する Intel Q6600) のコア #2 で実行されている場合にのみスローダウンが発生することがわかりました。アプリケーションはシングル スレッドであり、ほとんどの時間を CPU 集中型の行列演算ルーチンに費やしています。
1 つのコアが他のコアよりも遅いことがわかったので、すべての実行でプロセッサ アフィニティを同じコアに設定することで、正確なベンチマーク結果を得ることができます。ただし、1つのコアが遅い理由を知りたいです。
CPU の遅い部分を判断するためにいくつかの簡単なテスト ケースを試しましたが、テスト ケースは遅いコア #2 でも同じ時間で実行されました。複雑なアプリケーションのみがスローダウンを示しました。私が試したテストケースは次のとおりです。
浮動小数点の乗算と加算:
accumulator = accumulator*1.000001 + 0.0001;
三角関数:
accumulator = sin(accumulator); accumulator = cos(accumulator);
整数加算:
accumulator = accumulator + 1;
L2 キャッシュをミスさせようとしている間のメモリ コピー:
int stride = 4*1024*1024 + 37; // L2 cache size + small prime number for(long iter=0; iter<iterations; ++iter) { for(int offset=0; offset<stride; ++offset) { for(i=offset; i<array_size; i += stride) { array1[i] = array2[i]; } } }
質問:ある CPU コアが他のコアよりも遅いのはなぜですか?また、CPU のどの部分がその速度低下を引き起こしているのでしょうか?
編集:より多くのテストで、いくつかのHeisenbugの動作が示されました。プロセッサ アフィニティを明示的に設定すると、コア #2 でアプリケーションの速度が低下しません。ただし、プロセッサ アフィニティを明示的に設定せずにコア #2 で実行することを選択した場合、アプリケーションの実行速度は約 10% 遅くなります。私の単純なテスト ケースでは、プロセッサ アフィニティが明示的に設定されているため、同じ速度低下が見られなかった理由がこれで説明できます。そのため、コア #2 に住みたいプロセスがあるように見えますが、プロセッサ アフィニティが設定されていると邪魔になりません。
結論:マルチコア マシン上のシングル スレッド プログラムの正確なベンチマークが必要な場合は、必ずプロセッサ アフィニティを設定してください。