2016-09-09 3 views
2

Как сделать сжатие потока с boost :: compute?boost :: compute stream compaction

E.g. если вы хотите выполнять тяжелую работу только для определенных элементов массива. Сначала вы создаете массив маски с теми, соответствующими элементами, для которых вы хотите выполнить операцию:

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

[3 4 6 8] 

Размер конечного массива scan.last() + mask.last()

+0

Я не уверен, что сканирование должно с вещами. Если я правильно понимаю, это выглядит как len (mask) == len (scan) ', сканирование как-то должно быть восходящей последовательностью. Я не получаю, как «результат» (какая переменная это то, что представляет собой алгоритм уплотнения, который применяет эту операцию?), И я предполагаю, что размер результата на самом деле является «суммой (маской)»? Я думаю, вы можете немного уточнить этот вопрос. – sehe

+0

@sehe scan - операция префикса sum, это обычная операция в вычислениях 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); 
Смежные вопросы