グローバル メモリ内の 1 つの値 (定数ではない、単純な古いデータ) をすべてのスレッドにブロードキャストする必要があるアプリケーションがあります。スレッドは値を読み取るだけで、書き込む必要はありません。明示的な低レベル制御を提供しないメモリ ラッピング ライブラリを使用しているため、(cudaMemcpyToSymbol などを使用して) 定数キャッシュを使用するようにアプリケーションに明示的に指示することはできません。
このブロードキャストが内部でどのように行われるのか、また、各スレッドが一意のグローバル メモリ ロケーションにアクセスする通常のアクセス パターンとどのように異なるのか疑問に思っています (簡単にするために、この「通常の」アクセス パターンは結合されていると仮定します)。私は、ブロードキャストの場合に発生する可能性のある暗黙のシリアル化と、これが異なるアーキテクチャによってどのように影響を受ける可能性があるかに特に関心があります。
たとえば、Fermi の場合、おそらく最初に値にアクセスするスレッドが値を L2 キャッシュにプルし、次にその SM の L1 キャッシュにプルします。この時点で、SM に常駐するすべてのスレッドが L1 キャッシュから値を取得しようとします。すべてのスレッドが同じ L1 キャッシュ値にアクセスしようとすると、シリアル化のペナルティはありますか?
Kepler の場合、おそらく最初に値にアクセスするスレッドが値を L2 キャッシュにプルします (その後、L1 キャッシュが有効かどうかに応じて、L1 キャッシュにプルする場合とプルしない場合があります)。すべてのスレッドが L2 で同じ値にアクセスしようとすると、シリアル化のペナルティはありますか?
また、パーティションキャンプは心配ですか?
同様のトピックに対処する別の質問がいくつか見つかりましたが、私の好奇心を満たすのに十分な詳細レベルではありませんでした.
前もって感謝します!