私はGPUメモリキャッシングの仕組みに精通していないので、CPUに関連するメモリアクセスの時間的および空間的近接性の仮定がGPUにも当てはまるかどうかを知りたいと思います。つまり、CUDA Cでのプログラミングでは、キャッシュのスラッシングを防ぐために、Cの行優先配列ストレージ形式を考慮する必要がありますか?
どうもありがとう。
私はGPUメモリキャッシングの仕組みに精通していないので、CPUに関連するメモリアクセスの時間的および空間的近接性の仮定がGPUにも当てはまるかどうかを知りたいと思います。つまり、CUDA Cでのプログラミングでは、キャッシュのスラッシングを防ぐために、Cの行優先配列ストレージ形式を考慮する必要がありますか?
どうもありがとう。
はい、とても。
スレッドごとに4バイトの整数をフェッチしているとします。
各スレッドは、そのスレッドIDのインデックスを持つ1つの整数をフェッチしています。つまり、スレッド0はa [0]をフェッチし、スレッド1はa [1]をフェッチします...GPUと同様に、128バイトのキャッシュラインでフェッチします。偶然の一致として、ワープは32スレッドであり、ergo 32 * 4=128バイトです。これは、1つのワープに対して、メモリから1つのフェッチ要求を実行することを意味します。
スレッドが合計ランダムな順序でフェッチしていて、インデックス間の距離が128バイトを超えている場合。128バイトの32のメモリ要求を行う必要があります。これは、ワープごとに32倍のメモリでキャッシュを埋めることを意味し、問題が大きい場合、シナリオ1よりも最大32倍多くキャッシュが無効になります。
つまり、シナリオ1で通常はキャッシュに存在するメモリを要求する場合、シナリオ2では、グローバルメモリからの別のメモリ要求で解決する必要がある可能性が高くなります。
いいえ、はい。GPUはCPUと同じ種類の「キャッシュ」を提供しないため、いいえ。
ただし、基礎となるC配列レイアウトと、並行スレッドによるアクセス方法をパフォーマンスにとって非常に重要にする他の多くの制約があります。
CUDAメモリタイプの基本についてはこのページを、FermiGPUのキャッシュの詳細についてはこちらをご覧ください。