1

スレッド ブロックあたり 16 スレッドで起動される CUDA カーネルを設計しています。処理したい共有メモリ (つまり、スレッド ブロックごと) に N 個の int の配列があります。

スレッドのアクセス パターンが配列内で連続している場合、バンクの競合が発生しないということですか? 配列がchar配列の場合、バンクの競合が発生することは理解していますが、int配列の場合はどうなるか完全にはわかりません。4 つの連続する int の各セットが同じメモリ バンクを共有するため、バンクの競合が発生すると思いますか?

これが正しい場合、銀行の競合を防ぐための正しい解決策は何ですか? ヒストグラム サンプルのようなスクランブリングに対処しますか?

4

1 に答える 1

2

計算能力 >= 2.0 のデバイスの場合、共有メモリはインターリーブされた 32 ビット ワードに配置されます。したがって、ワープ内の各スレッド (ワープは 32 スレッド) が連続する 32 ビット ワードをアドレス指定する場合、バンクの競合は発生しません。また、バンクの競合を引き起こすことなく、異なるスレッドが同じ32 ビット値にアクセスできます。これは、すべてのスレッドが文字の配列から連続した値を読み取る場合、バンクの競合も発生しないことを意味します。

バンクの競合は、実際には、2 つ以上のスレッドが 32 の倍数のアドレスである異なる 32 ビット ワードをアドレス指定することによってのみ発生します。

これに対する答えは、他のコンピューティング機能では異なる場合があります。私は確認していません。

ブロックあたり 16 スレッドは非常に少ないことに注意してください。ブロック サイズがこれほど小さいと、GPU と CPU のパフォーマンスを向上させることはできないと思います (これがワークロード全体のほんの一部であり、データが既に GPU メモリにある場合を除きます)。

于 2012-06-08T17:46:03.417 に答える