0

indirectJ2[MAX_SUPER_SIZE]共有配列です。

私のcudaデバイスカーネルには、次のステートメントが含まれています(スレッドブロック内のすべてのスレッドによって実行されます):

int nnz_col = indirectJ2[MAX_SUPER_SIZE - 1];

これにより、銀行の競合が発生すると思われます。

ケプラー GPU の新しいシャッフル命令を使用して、上記のスレッド ブロック レベルのブロードキャストを効率的に実装する方法はあり ますか? ワープレベルでの仕組みを理解しています。シャッフル命令を超えた他のソリューション (たとえば、CUB の使用など) も歓迎します。

4

1 に答える 1

2

K40 では、そのコード行にバンク競合はありません。共有メモリ アクセスは、すでにブロードキャスト メカニズムを提供しています。プログラミングガイドより引用

「ワープの共有メモリ要求は、同じ 32 ビット ワード内、またはインデックス i と j が同じ 64 ワード アラインメントにある 2 つの 32 ビット ワード内のサブワードにアクセスする 2 つのスレッド間でバンク競合を生成しません。セグメント (つまり、最初のインデックスが 64 の倍数であるセグメント) で、j=i+32 の場合 (2 つのサブワードのアドレスが同じバンクにある場合でも): その場合、読み取りアクセスの場合、 32 ビットのワードは、要求元のスレッドにブロードキャストされます

スレッドブロック レベルでの共有メモリ バンクの競合などの概念はありません。バンクの競合は、そのワープ内の単一の命令に対して、単一のワープから発生する共有メモリ要求によって生成されるアクセス パターンにのみ関係します。

必要に応じて、単純なテスト カーネルを作成し、プロファイラー メトリック(例: shared_replay_overhead) を使用して、共有メモリ バンクの競合をテストできます。

ワープ シャッフル メカニズムは、1 つのワープを超えることはありません。したがって、スレッドブロック内の複数のワープに単一の数量をブロードキャストできる短いシャッフルのみのシーケンスはありません。共有メモリ使用して、ワープ内のすべてのスレッドに単一の数量への直接アクセスを提供できます。あなたはすでにそれをやっています。

グローバル メモリ、__constant__メモリ、およびカーネル パラメータをすべて使用して、スレッドブロック内のすべてのスレッドに同じ値を「ブロードキャスト」することもできます。

于 2015-03-08T21:04:31.220 に答える