8

私は大規模な科学アプリケーションのベンチマークを行っていましたが、同じ入力でも実行速度が 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 に住みたいプロセスがあるように見えますが、プロセッサ アフィニティが設定されていると邪魔になりません。

結論:マルチコア マシン上のシングル スレッド プログラムの正確なベンチマークが必要な場合は、必ずプロセッサ アフィニティを設定してください。

4

4 に答える 4

8

同じプロセッサ (CPU アフィニティ) に接続することを選択したアプリケーションがある場合があります。

オペレーティング システムは、すべてのデータを同じ L1 キャッシュにキャッシュできるため、多くの場合、同じプロセッサで実行したいと考えています。OS が多くの作業を行っているのと同じコアでプロセスを実行すると、CPU パフォーマンスの低下の影響を受ける可能性があります。

一部のプロセスが同じCPUに固執したいようです。ハードウェアの問題だと思います。

必ずしもあなたのOSが仕事をしている必要はありません。他のバックグラウンドデーモンがそれをしている可能性があります。

于 2009-05-13T19:03:29.217 に答える
2

最近のほとんどの CPU には、過熱または省電力機能のために、各 CPU コアの個別のスロットリングがあります。省電力をオフにするか、冷却を改善してみてください。または、CPUが悪いのかもしれません。私のi7では、「センサー」で報告された8つのコアのコア温度が約2〜3度異なります。フルロードでは、まだ変動があります。

于 2009-05-13T18:57:42.957 に答える
1

もう 1 つの可能性は、実行中にプロセスが 1 つのコアから別のコアに移行されていることです。CPU アフィニティを「遅い」コアに設定し、それが同じくらい速いかどうかを確認することをお勧めします。

数年前、マルチコアの時代の前に、「Web 開発」用にデュアルソケットの Athlon MP を購入しました。突然、私の Plone/Zope/Python Web サーバーの速度が遅くなりました。CPython インタープリターにはグローバル インタープリター ロックがあることが判明しましたが、Python スレッドは OS スレッドによってサポートされています。OS スレッドは CPU 間で均等に分散されましたが、一度に 1 つの CPU しかロックを取得できないため、他のすべてのプロセスは待機する必要がありました。

Zope の CPU アフィニティを任意の CPU に設定すると、問題が修正されました。

于 2009-05-15T17:52:30.047 に答える
0

私の Haswel ラップトップでも同様の現象が見られました。システムは静かで、X は実行されておらず、端末だけでした。異なるオプションで同じコードを実行するとnumactl --physcpubin、1 つを除くすべてのコアでまったく同じ結果が得られました。コアの周波数をTurboや他の値に変更しましたが、何も役に立ちませんでした。他のコアよりも常に低速で実行されていたコアを除いて、すべてのコアが予想された速度で実行されていました。その効果は再起動後も存続しました。

コンピュータを再起動し、BIOS でハイパースレッディングをオフにしました。オンラインに戻ると、元通りになりました。その後、ハイパースレッディングをオンにしましたが、今のところ問題ありません。

奇妙な。それが何であるかわかりません。

于 2014-11-28T09:40:47.627 に答える