Вы ищете «параллельное инклюзивное сканирование», которое из библиотеки thrust (поставляется с набором инструментов cuda) включает в себя:
#include <thrust/scan.h>
#include <thrust/device_vector.h>
#include <iostream>
int main( int argc, char * argv[] )
{
int data[17] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 };
thrust::device_vector< int > in( data, data + 17 );
thrust::device_vector< int > out( in.size() );
thrust::inclusive_scan( in.begin(), in.end(), out.begin() );
for ( int i = 0; i < out.size(); ++i )
std::cout << out[i] << " ";
std::cout << endl;
}
:
0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2
Или вы могли бы явно написать ядро - которое будет просто вариацией алгоритма сумма параллельного префикса , который хорошо обобщает тягу.