以下の 2 つの状況の間でどちらのレイテンシが長いか、
- データはグローバル メモリから共有メモリに入力され、すべてのスレッドが同時に共有メモリにアクセスします。複数のスレッドがアクセスする場合、データは同じである可能性があります。
- すべてのスレッドがグローバル メモリにアクセスしますが、データは隣接しています。
各値に 1 回だけアクセスする場合は、共有メモリを使用しても何も得られません。
共有メモリ内の値はブロック内でのみ有効であるため、各ブロック内の 1 つ以上のスレッドがグローバル メモリから値をロードする必要があります。したがって、グローバル メモリ アクセスを回避することはできません。
計算能力 >= 2.0 (Fermi) のデバイスを使用している場合、グローバル メモリから読み取られた値は L1 および L2 キャッシュに自動的にキャッシュされます。L1 のレイテンシは共有メモリと同じです。
レイテンシは、アクセスしているメモリに依存する固定値です。変わりません。レイテンシは、グローバル メモリよりも共有メモリの方が常にはるかに低くなります。
あなたが本当に求めているのは、どのタイプのアクセスが最高のメモリ スループットをもたらすかということだと思います。各値を 1 回だけ使用する場合は、ケース (2) で最高のスループットが得られます。値を再利用し、CC >= 2.0 を使用する場合、L1 にキャッシングを処理させると、最高のスループットが得られる可能性があります。CC < 2.0 で値を再利用する場合、共有メモリを使用すると最高のスループットが得られます。
ケース (1) は、バンクの競合を引き起こす場合と引き起こさない場合がありますが、共有メモリに既に格納されている値についてはスループットが向上します。
ケース (2) は、グローバル メモリの最適なアクセス パターンを示しています。
おそらく、私は2つのケースの違いを理解していません。しかし、もしそうなら:
ハードウェア アーキテクチャで許可されている場合は、2 番目の方法の方が高速です。たとえば、並列レジスタを備えたマルチコア マシンの場合です。2 番目のケースでは、純粋なソフトウェアの観点からでも、インターリーブによる競合状態などの懸念から、データをスレッドセーフにする必要がないことに注意してください。
次のように考えてください。
ケース 2:
5 つのディナーを提供する大きなテーブルがあり、それを食べる子供が 5 人います。同期は必要ありません。
ケース 1:
たとえば、3 つのテーブルと 3 つのディナーがあります。2 人の子供が同じ皿から食べなければならない場合があるため、お互いにぶつからないように動きを同期させる必要がある場合があります。同期とは遅延を意味します。