K40 では、そのコード行にバンク競合はありません。共有メモリ アクセスは、すでにブロードキャスト メカニズムを提供しています。プログラミングガイドより引用
「ワープの共有メモリ要求は、同じ 32 ビット ワード内、またはインデックス i と j が同じ 64 ワード アラインメントにある 2 つの 32 ビット ワード内のサブワードにアクセスする 2 つのスレッド間でバンク競合を生成しません。セグメント (つまり、最初のインデックスが 64 の倍数であるセグメント) で、j=i+32 の場合 (2 つのサブワードのアドレスが同じバンクにある場合でも): その場合、読み取りアクセスの場合、 32 ビットのワードは、要求元のスレッドにブロードキャストされます」
スレッドブロック レベルでの共有メモリ バンクの競合などの概念はありません。バンクの競合は、そのワープ内の単一の命令に対して、単一のワープから発生する共有メモリ要求によって生成されるアクセス パターンにのみ関係します。
必要に応じて、単純なテスト カーネルを作成し、プロファイラー メトリック(例: shared_replay_overhead
) を使用して、共有メモリ バンクの競合をテストできます。
ワープ シャッフル メカニズムは、1 つのワープを超えることはありません。したがって、スレッドブロック内の複数のワープに単一の数量をブロードキャストできる短いシャッフルのみのシーケンスはありません。共有メモリを使用して、ワープ内のすべてのスレッドに単一の数量への直接アクセスを提供できます。あなたはすでにそれをやっています。
グローバル メモリ、__constant__
メモリ、およびカーネル パラメータをすべて使用して、スレッドブロック内のすべてのスレッドに同じ値を「ブロードキャスト」することもできます。