これが実際に機能し、そのように思われる場合、GPUのキャッシュに関する多くの文書化されていないデータを取得できるため、それは素晴らしいことです。
ハイパフォーマンスコンピューティング研究の苛立たしい側面は、コードを調整しようとするときに、文書化されていないすべての命令セットとアーキテクチャ機能を掘り下げていることです。HPCでは、ハイパフォーマンスリンパックであろうとストリームであろうと、証拠はベンチマークにあります。これが "素晴らしい"かどうかはわかりませんが、高性能処理装置がどのように評価および評価されるかは間違いありません。
どうやら、ラインサイズはキャッシュがプラトーになり始めるところです(この例では約32バイト)。それはどこから来ましたか?
BryantとO'HallaronのComputer Systems:A Programmer's Perspectiveで「メモリマウンテン」として説明されている、キャッシュ階層のパフォーマンス概念に精通しているようですが、質問は、キャッシュの各レベル自体の理解が不十分であることを示しています。動作します。
キャッシュにはデータの「ライン」が含まれていることを思い出してください。これは、メインストアのどこかにあるメモリロケーションと調和する連続したメモリのストリップです。ライン内のメモリにアクセスすると、キャッシュが「ヒット」します。このメモリの取得に関連するレイテンシは、特定のキャッシュのレイテンシと呼ばれます。たとえば、10サイクルのL1キャッシュレイテンシは、要求されたメモリアドレスがすでにL1キャッシュラインの1つにあるたびに、10サイクルでそれを取得することを示します。
ポインタ追跡ベンチマークの説明からわかるように、メモリ全体で固定長のストライドが必要です。 注意:このベンチマークは、単純なキャッシュのように動作しない「ストリーム検出」プリフェッチユニットを備えた多くの最近のCPUでは期待どおりに機能しません。
その場合、最初の顕著なパフォーマンスプラトー(ストライド1から開始)は、以前のキャッシュミスから再利用されないストライドであることは理にかなっています。ストライドは、以前に取得したキャッシュラインを完全に通過するまでどのくらいの時間が必要ですか?キャッシュラインの長さ!
そして、ページサイズが2番目のプラトーがグローバルメモリの開始点であることをどのようにして知るのでしょうか。
同様に、再利用を超えたステップの次のプラトーは、オペレーティングシステムによって管理されているメモリページを各メモリアクセスでスワップする必要があるときです。キャッシュラインサイズとは異なり、メモリページサイズは通常、プログラマが設定または管理できるパラメータです。
さらに、レイテンシが最終的に十分なストライド長で低下するのはなぜですか?彼らは増え続けるべきではない
これは間違いなくあなたの質問の最も興味深い部分であり、以前に収集した情報(キャッシュラインのサイズ)と作業セットのサイズに基づいて、作成者がキャッシュ構造(連想性とセットの数)をどのように仮定するかを説明します彼らがまたがっているデータ。実験的なセットアップから、ストライドがアレイを「ラップアラウンド」することを思い出してください。十分に大きなストライドの場合、キャッシュ内に保持する必要のある配列データ(いわゆるワーキングセット)の総量は、配列内のより多くのデータがスキップされるため、小さくなります。これを説明するために、一連の階段を連続して上下に走り、4番目のステップごとにしか実行しない人を想像できます。この人は、2ステップごとに行うよりも少ない合計ステップに触れています。このアイデアは、紙でややぎこちなく述べられています:
ストライドが非常に大きい場合、ワーキングセットは減少し、キャッシュに再び収まるまで減少します。今回は、キャッシュが完全に関連付けられていない場合に競合ミスが発生します。
Bill Barthが彼の回答で言及しているように、著者は論文でこれらの計算をどのように行うかを述べています。
図1のデータは、完全に関連付けられた16エントリのTLB(128MBアレイ、8MBストライドではTLBオーバーヘッドなし)、20ウェイセットアソシアティブL1キャッシュ(1KBストライドで20KBアレイがL1に適合する)、および24ウェイを示唆しています。連想L2キャッシュを設定します(768KBアレイ、32KBストライドのL2ヒットレイテンシに戻ります)。これらは有効な数値であり、実際の実装は異なる場合があります。6つの4ウェイセットアソシアティブL2キャッシュもこのデータに一致します。