thrust :: exclusive_scan_by_key意外行为

时间:2015-04-28 09:50:10

标签: c++ cuda thrust

int data[ 10 ] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int keys[ 10 ] = { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 };
thrust::exclusive_scan_by_key( keys, keys + 10, data, data );

通过Thrust Site上的示例我预计0,0,1,1,2,2,3,3,4,4,但得到了0,0,0,0,0,0,0,0,0;它是错误的,还是某个地方定义了这种行为?

更重要的是,假设这不是一个错误,有没有办法轻松实现这种效果?

1 个答案:

答案 0 :(得分:3)

我认为您不了解scan_by_key的作用。来自documentation

  

“具体来说,如果binary_pred(* i,*(i + 1))为真,则[first1,last1]范围内的连续迭代器i和i + 1属于同一段,属于不同的段,否则”< / p>

scan_by_key要求您的键阵列使用连续值标记不同的段:

keys: 0 0 0 1 1 1 0 0 0 1 1 1
seg#: 0 0 0 1 1 1 2 2 2 3 3 3

推力比较相邻的键以确定段。

您的密钥正在生成这样的细分地图:

int keys[ 10 ] = { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 };
          seg#:    0  1  2  3  4  5  6  7  8  9

由于您正在执行独占扫描,因此对此类段映射(无论数据)的正确答案都将为全零。

您想要实现的“此效果”并不完全清楚,但您可能希望通过键操作进行背靠背稳定排序,扭转键和值的意义,将此数据重新排列到组段(即键1和2)在一起。