2

プロセッサがデータのキャッシュ ラインをプリフェッチするとき、そのアドレスからバイト数までプリフェッチするか、またはそのアドレスからキャッシュ ラインの半分までプリフェッチし、キャッシュの半分まで戻すかライン?

たとえば、キャッシュ ラインが 4 バイトで、アドレス 0x06 からプリフェッチするとします。0x06 0x07 0x08 0x09 でバイトをフェッチするか、アドレス 0x04 0x05 0x06 0x07 からプリフェッチしますか。

私が書いていて最適化する必要があるプログラムには、この情報が必要です。

4

2 に答える 2

2

thisによると(これは当然Intel固有です)

「キャッシュ ラインのサイズは 32 バイト、つまり 256 ビットです。キャッシュ ラインは、プロセッサの 64 ビット データ バスでの 4 回の読み取りのバーストによって満たされます。」

これは、8 バイトがメイン メモリから並列にフェッチされることを意味します。これらの 8 バイト内には、最初または最後がなく、バイトが 64 ビット幅のバスを介してフェッチされるため、同時に到着します。

キャッシュラインを満たすには4回の読み取りが必要なため、Intelはこれらの4回の読み取りの順序を指定していないようです。つまり、いくつかの選択肢が残されています。

  • 特定の順序はないと仮定します
  • アドレスが最低から最高に、またはその逆にフェッチされると仮定します。

もちろん、最初の仮定は最も安全です-順序は文書化されていないことがわかる限りです(したがって、モデルまたはその他の要因に依存する可能性があります)

于 2013-09-11T11:54:56.317 に答える
1

キャッシュ ラインにはアライメントが必要なので、キャッシュ ラインのフェッチを引き起こすミスが発生した最初の読み取りまたは最初のトランザクションがキャッシュ ラインの途中にある場合、キャッシュ ライン全体が戻って読み取られます (したがって、その部分はあなたの住所の前と後の部分)。

一般に、キャッシュはアドレスの一部を使用してヒット/ミスを判断します。したがって、キャッシュ ラインが 256 バイトであるとすると、ヒット/ミストを決定するために使用されるアドレス ビットはビット 8 から始まり、キャッシュの大きさ (深度とウェイ) に応じて、何ビットを見るかが決まります。したがって、アドレス 0x123 でのアクセスがミスを生成した場合、私の例を使用すると、0x100 から 0x1FF までのキャッシュ ラインが読み取られます。

それが逆の場合は、より多くのロジックと作業と混乱が生じます。任意のバイトでキャッシュ ラインを開始できれば、ヒット/ミスを判断するのが難しくなり、キャッシュ ラインが重複する可能性があります。 (一部のデータ項目は複数の場所にあります)、全体的に管理する必要があり、キャッシュが遅くなります。

于 2013-09-11T14:22:33.953 に答える