融合していないメモリアクセスを結合したものに簡単に変換する方法があるかどうかは疑問でした。のは、この配列の例を見てみましょう:未融合アクセスから融合メモリアクセスへ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)あなたのコードをベンチマークしましたが、ベンチマークの結果から、一貫性のないメモリアクセスが減速の大きな原因であることがわかりましたか? (2)実際にメモリアクセスパターンを示す[mcve]を投稿しない限り、メモリアクセスを最適化するのに役立つ人は誰もいません –
まあ、私は2つのベンチマークを行いました。そして、彼らは減速を確認しました(それほど多くはありませんが、遅いです...)。これらの操作は複雑なプログラムの一部なので、いつものように簡単なコードを表示するのは難しいです。私は同じ問題を引き起こす何かを実装しようとします。 –