2016-09-09 6 views
2

Wie stream compaction mit boost :: compute?boost :: compute stream kompression

z. wenn Sie schwere Operationen nur für bestimmte Elemente im Array ausführen möchten. Zuerst erzeugen Sie Maskenanordnung mit Einsen auf Elemente, für die entsprechende Sie Operation ausgeführt werden soll:

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

Anschließend führen exklusive Scan (Präfixsumme) von Maskenanordnung zu erhalten:

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

Dann kompakt dieses Array mit:

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

Zur endgültigen Anordnung von verdichteten Indizes (inds) zu erhalten:

[3 4 6 8] 

Größe des fertigen Arrays scan.last() + mask.last()

+0

Ich bin nicht sicher, was scannen, um mit den Dingen hat. Wenn ich es richtig verstehe, sieht es aus wie 'len (mask) == len (scan)', Scan muss irgendwie aufsteigend sein. Ich bekomme nicht, wie "das Ergebnis" (welche Variable ist das, was ist der Komprimierungsalgorithmus, der diese Operation angewendet wird?) Und ich würde vermuten, dass die Größe des Ergebnisses tatsächlich "Summe (Maske)" ist? Ich denke, Sie möchten vielleicht die Frage ein wenig klären. – sehe

+0

@Sehe Scan ist ein Präfix Summe Operation, es ist eine häufige Operation in GPGPU Computing, ich schlage vor, Sie auf https://www.cs.cmu.edu/~guyb/papers/Ble93.pdf schauen – DikobrAz

Antwort

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