boost::compute stream compact

Как сделать потоковое уплотнение с 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;

Чтобы получить окончательный массив сжатых индексов (индексов):

[3 4 6 8]

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

1 ответ

Решение
#include <boost/compute/algorithm/copy_if.hpp>

using namespace boost::compute;

detail::copy_index_if(mask.begin(), mask.end(), inds.begin(), _1 == 1, queue);
Другие вопросы по тегам