2016-10-05 9 views
1

融合していないメモリアクセスを結合したものに簡単に変換する方法があるかどうかは疑問でした。のは、この配列の例を見てみましょう:未融合アクセスから融合メモリアクセスへCUDA

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

、私はその後、ブロック0アクセスdW[0]でのスレッド0とブロック0アクセスdw[1]に1スレッドならば、それはグローバルメモリ内の合体アクセスだということを知っています。問題は、私は2つの操作があることです。最初のものは上記のように合体されます。しかし、ブロック0のスレッド1がdW[0],dW[1]および​​の両方で操作を行う必要があるため、2番目のスレッドは動作しません。

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

この問題を回避することができるかどうか知っていますか?

+1

(1)あなたのコードをベンチマークしましたが、ベンチマークの結果から、一貫性のないメモリアクセスが減速の大きな原因であることがわかりましたか? (2)実際にメモリアクセスパターンを示す[mcve]を投稿しない限り、メモリアクセスを最適化するのに役立つ人は誰もいません –

+0

まあ、私は2つのベンチマークを行いました。そして、彼らは減速を確認しました(それほど多くはありませんが、遅いです...)。これらの操作は複雑なプログラムの一部なので、いつものように簡単なコードを表示するのは難しいです。私は同じ問題を引き起こす何かを実装しようとします。 –

答えて

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]) 

アイデアが合体アクセスは、共有メモリとは関係ありません(ただし、バンク競合が他にないので、数学を行うには、共有合着方法で共有でデータをロードした後、使用することです物事をスピードアップします手、それは通常はうまくいっている)。

より正確なヘルプが必要な場合は、さらに情報を提供する必要があります。 これは単なるヒントです。

+0

私は共有メモリを使用しようとします、ありがとう。 –

関連する問題