2016-10-04 16 views
1

2次元の大きさがM×Nであり、Nは2以上の累乗であり、Mは2の累乗ではない任意の整数です。例えば、配列Aのサイズは200x32です。OpenCL reduction - 2D行列から1次元配列へ

配列の行全体でreduce(add)操作を行うことで、配列Aをサイズ1x32に縮小したいと考えています。 Blelloch/Hillisスキャンアルゴリズムを使用して連続する要素を追加することで、私がやってきた削減の大半は配列を単一の値に減らします。しかし私の場合、連続した要素は無関係であり、追加することはできません。しかし、要素[1,33,65 ...]と要素[2,34,66 ..]などを追加する必要があります。

これは合体アクセスではないため、この問題を解決するにはどうすればよいでしょうか?

答えて

2

それは合体さ:

WorkItem1 -> 1 + 33 + 65 + ... 
WorkItem2 -> 2 + 34 + 66 + ... 
WorkItem3 -> 3 + 35 + 67 + ... 
... 

あなたがスレッドのグループ内のすべてのメモリ操作は、連続したメモリ位置にある見ることができるように。

さらに最適化するために、ベクトル操作を試すこともできますが、私の推測によれば、コンパイラはすでにそれを最適化するでしょう。

+0

私はこれを学んでいるので、私はそれを正しく理解していますか分かりません。メモリ位置1,33,65は、メモリ内に連続して配置されていない。この一体化されたアクセスはどのようにして行われますか? – OCL

+2

合体アクセスは、クロックの「t」ごとにすべてのメモリアクセスが連続している場合です。作業項目1は実行されず終了し、作業項目2が開始されます。代わりに、すべてが同時に実行されます。そして、必要なメモリはt1→[1,32]、t2→[33,64]、...などです – DarkZeros

関連する問題