2016-09-09 4 views
2

boost :: computeでストリームコンパクションを行う方法は?boost :: computeストリームコンパクション

など。配列内の特定の要素に対してのみ重い操作を実行したい場合に使用します。まず、あなたが操作を実行する対象の要素に対応するものとマスク配列を生成します。

mask = [0 0 0 1 1 0 1 0 1] 

次に取得するためにマスク配列の排他的スキャン(接頭和)を実行します。

scan = [0 0 0 0 1 2 2 3 3] 

はその後、この配列を圧縮しますで:

if (mask[i]) 
    inds[scan[i]] = i; 

は、圧縮インデックスの最終配列(INDS)を取得します最終配列の

サイズは、私は物事をしているかスキャンわからないscan.last() + mask.last()

+0

です。私が正しく理解していれば 'len(mask)== len(scan)'のように見えますが、何らかの理由でスキャンが昇順である必要があります。私はどのように "結果"(どの変数があるのか​​、その操作を適用する圧縮アルゴリズムは何ですか?)を得ていません。結果のサイズは実際には 'sum(mask)'でしょうか?私は少し質問を明確にしたいと思うかもしれないと思います。 – sehe

+0

@ scanはGPGPUコンピューティングの一般的な操作であるプレフィックスサム演算です。https://www.cs.cmu.edu/~guyb/papers/Ble93.pdfを参照することをお勧めします – DikobrAz

答えて

2
#include <boost/compute/algorithm/copy_if.hpp> 

using namespace boost::compute; 

detail::copy_index_if(mask.begin(), mask.end(), inds.begin(), _1 == 1, queue); 
関連する問題