warp 内のすべてのスレッドがグローバル メモリ内の同じアドレスにアクセスする
AMD GPU について、あなたの質問にすぐに答えることができます。Nvidia の場合、グーグルは十分に迅速に答えを見つけました。
ワープのすべてのスレッドがグローバル メモリの同じ 32 ビット アドレスを読み取るとどうなるか知りたいです。メモリ要求はいくつありますか? シリーズ化はありますか?GPUはFermiカード、プログラミング環境はCUDA 4.0。
http://developer.download.nvidia.com/CUDA/training/NVIDIA_GPU_Computing_Webinars_Best_Practises_For_OpenCL_Programming.pdf、2009年付け、次のように述べています。
合体:
グローバル メモリ レイテンシ: 400 ~ 600 サイクル。単一の最も重要なパフォーマンスの考慮事項!
ハーフ ワープのスレッドによるグローバル メモリ アクセスは、サイズが 8 ビット、16 ビット、32 ビット、64 ビットのワードの場合は 1 つのトランザクションに、128 ビットの場合は 2 つのトランザクションに結合できます。
グローバル メモリは、16 ワードと 32 ワードのアライメントされたセグメントを構成していると見なすことができます。
Compute Capability 1.0 および 1.1 での合体:
ハーフ ワープの K 番目のスレッドは、セグメントの k 番目のワードにアクセスする必要があります。ただし、すべてのスレッドが参加する必要はありません
Compute Capability
1.2 および 1.3 での合体:
セグメントサイズに収まるあらゆるアクセスパターンの合体
そのため、ワープのすべてのスレッドがグローバル メモリの同じ 32 ビット アドレスにアクセスするように思えますが、Compute Capability 1.2 以上であれば、期待どおりに機能します。しかし、1.0 と 1.1 ではありません。
あなたのカードは大丈夫です。
Nvidia でこれをテストしていないことを認めなければなりません。AMD用にテストしました。
キャッシュとキャッシュされていないロードの違い
まず、あなたが参照しているプレゼンテーションのスライド 4 を見てください。
つまり、「CPU と GPU の違い」というタイトルのスライドでは、CPU には巨大なキャッシュがあり、GPU にはありません。
数年前、そのようなスライドは、GPU にはキャッシュがまったくないことを示していたかもしれません。ただし、GPU はますます多くのキャッシュを追加し始め、および/またはますます多くのローカルをキャッシュに切り替え始めています。
コンピュータ アーキテクチャにおける「キャッシュ」とは何かを理解しているかどうかはわかりません。これは大きなトピックなので、簡単な回答のみを提供します。
基本的に、キャッシュはローカル メモリのようなものです。キャッシュとローカル メモリはどちらも、GPU のプライベート DRAM であれ、CPU のシステム メモリであれ、DRAM やメイン メモリよりもプロセッサまたは GPU に近いものです。DRAM メイン メモリは、Nvidia グローバル メモリによって呼び出されます。スライド 9 はこれを示しています。
キャッシュとローカル メモリはどちらも、DRAM グローバル メモリよりも GPU に近いものです。スライド 9 では、これらは GPU と同じチップ内にあるものとして描かれていますが、DRAM は別のチップです。これは、レイテンシ、スループット、電力、そしてもちろんバスの使用率 (帯域幅に関連する) に、いくつかの良い影響を与える可能性があります。
レイテンシ: グローバル メモリは 400 ~ 800 サイクル離れています。これは、アプリケーションにワープが 1 つしかない場合、400 ~ 800 サイクルごとに 1 つのメモリ操作しか実行されないことを意味します。これは、速度を落とさないようにするために、並列で実行できる、つまり高い MLP (Memory Level Parallelism) を持つメモリ要求を生成する多くのスレッド/ワープが必要であることを意味します。幸いなことに、グラフィックスは通常これを行います。キャッシュが近くにあるため、レイテンシが低くなります。あなたのスライドはそれが何であるかを述べていませんが、他の場所では 50 ~ 200 サイクルであり、グローバル メモリよりも 4 ~ 8 倍高速です。これは、速度低下を避けるために必要なスレッドとワープを少なくすることを意味します。
スループット/帯域幅: 通常、DRAM グローバル メモリよりもローカル メモリやキャッシュの帯域幅の方が多くなります。あなたのスライドは、177 GB/秒に対して 1+ TB/秒と言っています。つまり、キャッシュとローカル メモリは 5 倍以上高速です。このより高い帯域幅は、フレームレートの大幅な向上につながる可能性があります。
電力: DRAM グローバル メモリではなく、キャッシュまたはローカル メモリに多くの電力を節約できます。これは、デスクトップのゲーミング PC では問題にならないかもしれませんが、ラップトップやタブレット PC では問題になります。実際、これはデスクトップ ゲーム用 PC にとっても重要です。電力が少ないということは、(オーバー)クロックが速くなることを意味するからです。
では、上記のローカル メモリとキャッシュ メモリは似ていますか? 違いは何ですか?
基本的に、ローカルメモリよりもキャッシュをプログラムする方が簡単です。ローカル メモリを適切に管理し、必要に応じてグローバル メモリから内容をコピーし、フラッシュするためには、非常に優れた専門家の nionja プログラマが必要です。一方、キャッシュメモリは、キャッシュされたロードを実行するだけで管理がはるかに簡単で、メモリは自動的にキャッシュに入れられ、次回はより高速にアクセスされます。
しかし、キャッシュには欠点もあります。
まず、実際には、ローカル メモリよりも少し多くの電力を消費します。実際にローカル メモリとグローバル メモリが別々に存在する場合は、消費することになります。ただし、Fermi では、ローカル メモリをキャッシュとして構成することも、その逆も可能です。(何年もの間、GPU 関係者は、「悪臭を放つキャッシュは必要ありません。キャッシュ タグやその他のオーバーヘッドはまったく無駄です。」
さらに重要なことに、キャッシュはキャッシュ ラインで動作する傾向がありますが、すべてのプログラムがそうするわけではありません。これは、あなたが言及したバス使用率の問題につながります。ワープがキャッシュ ライン内のすべての単語にアクセスする場合は、すばらしいことです。しかし、ワープがキャッシュ ライン内の 1 ワード、つまり 1 4 バイト ワードのみにアクセスし、124 バイトをスキップする場合、128 バイトのデータがバスを介して転送されますが、使用されるのは 4 バイトだけです。つまり、バス帯域幅の 96% 以上が無駄になっています。これはバス使用率が低いことです。
次のスライドでは、データをローカル メモリにロードするために使用するような非キャッシュ ロードでは 32 バイトしか転送されないため、32 バイトのうち「28 バイトだけ」が無駄になることを示しています。言い換えると、非キャッシュ ロードは、キャッシュ ロードよりも 4 倍効率的で、4 倍高速です。
それでは、どこでも非キャッシュ ロードを使用してみませんか? それらはプログラミングが難しいため、熟練した忍者プログラマーが必要です。そして、キャッシュはほとんどの場合うまく機能します。
したがって、専門の忍者プログラマーに多くの時間を費やしてすべてのコードを最適化し、非キャッシュ ロードと手動で管理されたローカル メモリを使用する代わりに、キャッシュ ロードを使用して簡単なことを行い、高給の専門家に任せます。忍者プログラマーは、キャッシュがうまく機能しないものに集中します。
その上、誰もそれを認めたくありませんが、多くの場合、キャッシュは専門の忍者プログラマーよりも優れています.
お役に立てれば。スループット、電力、およびバス使用率: 削減に加えて