1

合体していないメモリアクセスを合体したメモリアクセスに変換する簡単な方法があるかどうか疑問に思っていました。この配列の例を見てみましょう:

dW[[w0,w1,w2][w3,w4,w5][w6,w7][w8,w9]]

dW[0]これで、スレッド 0 がブロック 0 アクセスで、次にスレッド 1 がブロック 0 アクセスdw[1]である場合、それはグローバル メモリ内の合体アクセスであることがわかります。問題は、2 つの操作があることです。最初のものは、上記のように結合されます。しかし、2 つ目は、ブロック 0 のスレッド 1 が と の両方で操作を行う必要があるためではありませdW[0]ん。dW[1]dW[2]

コンテナーの初期形状が合体アクセスを許可または禁止することを知っています。しかしdW、非常に大きな配列であり、プロセス中に変換できません。

この問題を軽減できるかどうか知っていますか?

4

1 に答える 1

2

おそらく、共有メモリを使用してみてください。

たとえば、最初の操作が結合されたデータにアクセスし、2 番目の操作が多くのストライドを行ったとします。これは物事をスピードアップするかもしれません

__shared__ int shared[BLOCK_SIZE];
// Load data global -> shared with coalesced access ; you may need to load a bit more before/after depending on you application
shared[tid] = global[some id]
syncthreads();
// Do the math with coalescing access
function0(shared[tid])
// Do the math with the non coalescing access
function1(shared[tid+-1 or wathever])

合体アクセスは共有メモリでは問題にならないため (ただし、バンクの競合は問題になりますが、通常は問題ありません)。

より正確なヘルプが必要な場合は、より多くの情報を提供する必要があります。それは単なるヒントです。

于 2016-10-05T16:29:45.990 に答える