通过CUDA Thrust查找键的出现次数和第一次出现的键的位置

说我有一个键矢量

thrust::device_vector<int> keys(10); 
keys[0] = 51; // -----> 
keys[1] = 51; 
keys[2] = 72; // -----> 
keys[3] = 72; 
keys[4] = 72; 
keys[5] = 103; //-----> 
keys[6] = 103; 
keys[7] = 504; // ------> 
keys[8] = 504 
keys[9] = 504 ; 

我事先已经知道有4个不同的键值
这个载体.我想填充两个设备阵列
pidx [4]和pnum [4].

> pidx数组为我提供了每个不同键的第一个位置
键向量,即标有—->的位置.在上面的代码片段中.所以,在这个例子中,我应该有pidx [4] = {0,2,5,7}.
> pnum数组给出了每个键的出现次数.所以,在这个例子中,我应该有
pnum [4] = {2,3,3,3}.

如何使用CUDA Thrust执行上述操作?

最佳答案 这不是最佳解决方案,但我无法找到更好的方法.

// Use `unique` to grab the distinct values
thrust::device_vector<int> values(4);
thrust::unique_copy( keys.begin(), keys.end(), values.begin() );

// For each of the values use `count` to get the frequencies
for ( int i = 4; i != 0; --i )
    pnum[i] = thrust::count( keys.begin(), keys.end(), values[i] );

// Use prefix sum to get the indices
thrust::exclusive_scan( pnum.begin(), pnum.end(), pidx.begin() );
点赞