最初の反復中にループの実行が遅くなる原因は何ですか?

Bartvbl

std :: chronoを少し試してみるために次のプログラムを作成しました。

#include <iostream>
#include <chrono>

int main(int argc, char** argv) {
    const long iterationCount = 10000;
    long count = 0;
    for(long i = 0; i < iterationCount; i++) {
        auto start = std::chrono::high_resolution_clock::now();
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        count++;count++;count++;count++;count++;count++;count++;count++;count++;count++;
        auto end = std::chrono::high_resolution_clock::now();

        auto timeTaken = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
        std::cout << timeTaken << " " << std::endl;
    }
}

コンパイラの最適化を有効にせずにG ++を使用してこれをコンパイルしました。

g++ chrono.cpp -o chrono

その後、このプログラムを数回実行したところ、興味深いパターンが得られました。最初の500〜1000回の反復では、プログラムは残りの反復よりも約7〜8倍遅く実行されます。

このプログラムの出力例は次のとおりです:https//pastebin.com/tUQsQEAQ

ランタイムでこの不一致の原因は何ですか?私の最初の反応はキャッシュでしたが、それはすぐに飽和状態になりませんか?

重要な場合、私のオペレーティングシステムはUbuntu 18.04で、g ++のバージョンは7.3.0です。

マーガレットブルーム

マイクロアーキテクチャの実装で定義された時間が経過した後、CPUが同じ火力発電のヘッドルームを見つけることができる場合、周波数スケーリングが開始され、要求の厳しいコアのクロックが最大(TDPの制限内)まで高速化されます。

Intelの実装はターボブーストと呼ばれます。

システムで周波数スケーリングを無効にすると(たとえば、sudo cpupower frequency-set --governor performance-cpupowercpupowerutilsパッケージに含まれている場合)、各反復の時間はほぼ同じになります。


ループ自体は非常に簡単に予測できます。ループコントロールの最後に1つだけではなく、わずかな予測ミスしか期待できません。C++ライブラリ内のコードは予測が難しい可能性がありますが、それでもそれほど時間はかかりません( BPUがコードに追いつくための1000回の反復)。
したがって、分岐予測の誤予測を排除できます。

多かれ少なかれ同じことがIキャッシュにも当てはまります(C ++ライブラリの実装が変数の使用に重きを置いていない限り、Dキャッシュの使用はほとんどありません)。
コードは、L1-Iに収まるように十分に小さくする必要があり、ほとんどの場合、DSBにも収まります。
L1-私は、解決するのに1000回の反復を必要とせず、キャッシュに重いセットの競合がある場合、1000回の反復後に消えない一般的な速度低下として表示されます。

一般的に言えば、CPUが最初にキャッシュ(データ、命令、TLB)をいっぱいにするため、ループに含まれる依存関係チェーンの2回目の反復からコードがより高速に実行されることは既知の効果です。
CPUのリソースが不足すると、最終的には再び速度が低下する可能性があります。たとえば、ポートのプレッシャーが大きい場合(たとえば、同一の制限ポートの長い遅延命令が多数ある場合)、RSがFEのストールをいっぱいにする可能性があります。 MOB / SB / LBを埋める大量のロード/ストアまたはBOBを埋める大量のジャンプ。
ただし、これらの効果は非常に迅速に開始され、コードの実行時間を支配するようになります。
この場合、速度低下は非常に遅く(CPU時間で)発生するため、ターボブーストなどのオンデマンドプロセスについて考えることが望ましいです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この関数の実行が遅くなる原因は何ですか?

分類Dev

MPI_Isend / Irecvは、forループの最初の反復でのみ実行されます。ループの後続の反復でそれが実行されるのを妨げているのは何ですか

分類Dev

ループが最初の反復でのみ正しく機能するのはなぜですか?

分類Dev

Pythonでこのループの実行が徐々に遅くなるのはなぜですか?

分類Dev

forループがRで1回余分に反復を実行しているのはなぜですか?

分類Dev

テンソルフローのインポートが非常に遅くなる原因は何ですか?

分類Dev

反復の実行が非常に遅いのはなぜですか?

分類Dev

Pythonプログラムが最初に非常に遅く実行されるのはなぜですか?

分類Dev

最初の反復後に実行されないのにgetcharが入るのはなぜですか?

分類Dev

Unityの起動が遅くなる原因は何ですか?

分類Dev

Unityの起動が遅くなる原因は何ですか?

分類Dev

各行を個別に反復するのではなく、すべての行を反復するループ

分類Dev

最初の反復後にこのループが壊れるのはなぜですか?

分類Dev

反復が何度もループするのはなぜですか?

分類Dev

push_backを省略すると、ループの実行が遅くなるのはなぜですか?

分類Dev

スケジュールされたタスクの実行が遅れる原因は何ですか?

分類Dev

F#パフォーマンス:このコードが非常に遅くなる原因は何ですか?

分類Dev

CardViewが原因でスクロールプロセスが遅くなるのはなぜですか?

分類Dev

遅延ではなく一度に発生するループ反復の場合

分類Dev

このループが最初の反復で中断するのはなぜですか?

分類Dev

ループの最初の反復ではなく、値をゼロに変更する方法

分類Dev

プログラムにwhileループの最初の反復を常に実行させるにはどうすればよいですか?

分類Dev

アプリが遅くなる原因は何ですか?

分類Dev

いくつかのタプルを反復するループに基づく範囲の簡潔な表記法は何ですか

分類Dev

B = numpy.dot(A、x)がB [i、:、:] = numpy.dot(A [i、:、:]、x))を実行することで、ループが非常に遅くなるのはなぜですか?

分類Dev

最初の反復でのみ、または実行前にループ内の変数をチェックするクリーンな方法はありますか?

分類Dev

これは、3回の反復後に停止するのではなく、whileループが無限の状態になるのはなぜですか?

分類Dev

このループが徐々に遅くなるのはなぜですか?

分類Dev

最初の反復でのみ実行されるforループ

Related 関連記事

  1. 1

    この関数の実行が遅くなる原因は何ですか?

  2. 2

    MPI_Isend / Irecvは、forループの最初の反復でのみ実行されます。ループの後続の反復でそれが実行されるのを妨げているのは何ですか

  3. 3

    ループが最初の反復でのみ正しく機能するのはなぜですか?

  4. 4

    Pythonでこのループの実行が徐々に遅くなるのはなぜですか?

  5. 5

    forループがRで1回余分に反復を実行しているのはなぜですか?

  6. 6

    テンソルフローのインポートが非常に遅くなる原因は何ですか?

  7. 7

    反復の実行が非常に遅いのはなぜですか?

  8. 8

    Pythonプログラムが最初に非常に遅く実行されるのはなぜですか?

  9. 9

    最初の反復後に実行されないのにgetcharが入るのはなぜですか?

  10. 10

    Unityの起動が遅くなる原因は何ですか?

  11. 11

    Unityの起動が遅くなる原因は何ですか?

  12. 12

    各行を個別に反復するのではなく、すべての行を反復するループ

  13. 13

    最初の反復後にこのループが壊れるのはなぜですか?

  14. 14

    反復が何度もループするのはなぜですか?

  15. 15

    push_backを省略すると、ループの実行が遅くなるのはなぜですか?

  16. 16

    スケジュールされたタスクの実行が遅れる原因は何ですか?

  17. 17

    F#パフォーマンス:このコードが非常に遅くなる原因は何ですか?

  18. 18

    CardViewが原因でスクロールプロセスが遅くなるのはなぜですか?

  19. 19

    遅延ではなく一度に発生するループ反復の場合

  20. 20

    このループが最初の反復で中断するのはなぜですか?

  21. 21

    ループの最初の反復ではなく、値をゼロに変更する方法

  22. 22

    プログラムにwhileループの最初の反復を常に実行させるにはどうすればよいですか?

  23. 23

    アプリが遅くなる原因は何ですか?

  24. 24

    いくつかのタプルを反復するループに基づく範囲の簡潔な表記法は何ですか

  25. 25

    B = numpy.dot(A、x)がB [i、:、:] = numpy.dot(A [i、:、:]、x))を実行することで、ループが非常に遅くなるのはなぜですか?

  26. 26

    最初の反復でのみ、または実行前にループ内の変数をチェックするクリーンな方法はありますか?

  27. 27

    これは、3回の反復後に停止するのではなく、whileループが無限の状態になるのはなぜですか?

  28. 28

    このループが徐々に遅くなるのはなぜですか?

  29. 29

    最初の反復でのみ実行されるforループ

ホットタグ

アーカイブ