您正在寻找“并行包含扫描”,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
或者您可以显式编写一个内核 - 这将只是 parallel prefix sum 算法的一种变体,它很好地概括了推力。