0

キャッシュされていない無関係なアドレスを指している 2 つのポインターがあると仮定してみましょう。したがって、逆参照されるときは両方ともメイン メモリから取得する必要があります。

int load_and_add(int *pA, int *pB)
{
    int a = *pA;   // will most likely miss in cache
    int b = *pB;   // will most likely miss in cache 

    // ...  some code that does not use a or b

    int c = a + b;
    return c;
}

アウトオブオーダー実行により、 の値が計算される前にコードを実行できる場合、最新の Intel プロセッサでは値の取得と処理cはどのように行われるのでしょうか?ab

潜在的にパイプライン化されたメモリ アクセスは完全にシリアル化されていますか、それとも CPU のメモリ コントローラによって何らかのフェッチ オーバーラップが実行されている可能性がありますか?

つまり、メイン メモリにアクセスするのに 300 サイクルかかると仮定すると、フェッチabコストは 600 サイクルになりますか、それともアウトオブオーダーの実行によりオーバーラップが可能になり、サイクルのコストが削減される可能性がありますか?

4

1 に答える 1

3

最新の CPU には複数のロード バッファがあるため、複数のロードが同時に未処理になる可能性があります。メモリ サブシステムは大量にパイプライン化されているため、その多くの部分でレイテンシよりもはるかに優れたスループットが得られます。(たとえば、プリフェッチを使用すると、Haswell は (メイン メモリから) 1 クロックごとに 8B のロードを維持できます。ただし、アドレスが事前にわからない場合のレイテンシは数百サイクルになります)。

つまり、Haswell コアは、キャッシュ/メモリからのデータを待機している最大 72 個の未処理のロード uop を追跡できます。(これはコアごとです。共有 L3 キャッシュには、システム全体のロード/DRAM およびメモリ マップド IO へのストアを処理するためのバッファも必要です。)

Haswell の ReOrder Buffer のサイズは 192 uopsであるため、とがリタイアしていない最も古い命令のロード中に、最大 190 uops の作業をcode that does not use a or b発行および実行できます。命令/uops は、正確な例外をサポートするために廃止されました。 ROB サイズは基本的に、キャッシュ ミスなどの遅い操作のレイテンシを隠すための、順序が正しくないウィンドウの制限ですab

タグ wikiの他のリンクも参照してください。Agner Fog のマイクロアーキテクチャ ガイドは、CPU パイプラインのメンタル モデルを作成して、コードがどのように実行されるかを大まかに理解するのに最適です。

David Kanter の Haswell の記事から: Intel Haswell、David Kanter の記事より

于 2016-05-02T19:46:54.363 に答える