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

cur*_*rer 5 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 ; 
Run Code Online (Sandbox Code Playgroud)

我事先就知道4这个向量中有不同的键值。我想填充两个设备数组 pidx[4]pnum[4].

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

  2. pnum数组为我提供了每个键的出现次数。所以,在这个例子中,我应该有 pnum[4] = {2, 3, 2, 3}.

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

Lyt*_*yth 2

这不是最佳解决方案,但我也想不出更好的方法。

// 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() );
Run Code Online (Sandbox Code Playgroud)