Как сделать сжатие потока с 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()
Я не уверен, что сканирование должно с вещами. Если я правильно понимаю, это выглядит как len (mask) == len (scan) ', сканирование как-то должно быть восходящей последовательностью. Я не получаю, как «результат» (какая переменная это то, что представляет собой алгоритм уплотнения, который применяет эту операцию?), И я предполагаю, что размер результата на самом деле является «суммой (маской)»? Я думаю, вы можете немного уточнить этот вопрос. – sehe
@sehe scan - операция префикса sum, это обычная операция в вычислениях GPGPU, я предлагаю вам посмотреть https://www.cs.cmu.edu/~guyb/papers/Ble93.pdf – DikobrAz