thrust :: sort_by_key:如何将结果存储在单独的数组中?

时间:2013-01-18 05:47:48

标签: sorting cuda thrust

我目前按照以下方式按键排序值

thrust::sort_by_key(thrust::device_ptr<int>(keys), 
                    thrust::device_ptr<int>(keys + numKeys),
                    thrust::device_ptr<int>(values);

根据“keys”对“values”数组进行排序。

有没有办法让“values”数组保持不变,而是将“values”的排序结果存储在一个单独的数组中?

提前致谢。

1 个答案:

答案 0 :(得分:2)

没有直接的方法来做你要求的事情。你有两种选择在功能上实现同样的目标。

第一个是在调用之前复制values数组,为您提供原始数据的已排序和未排序版本。所以你的例子变成了

thrust::device_vector<int> values_sorted(thrust::device_ptr<int>(values),
                                     thrust::device_ptr<int>(values + numKeys));

thrust::sort_by_key(thrust::device_ptr<int>(keys), 
                    thrust::device_ptr<int>(keys + numKeys),
                    values_sorted.begin());

第二种方法是不要将values数组传递给所有的排序。 Thrust有一个非常有用的置换迭代器,它允许对数组进行无缝置换访问,而无需修改存储该数组的顺序(所以如果你愿意,那么基于迭代器的收集操作)。为此,创建一个索引向量,然后按键对其进行排序,然后使用该排序索引实例化一个置换迭代器,如

typedef thrust::device_vector<int>::iterator iit;

thrust::device_vector<int> index(thrust::make_counting_iterator(int(0)),
                                 thrust::make_counting_iterator(int(numKeys));    

thrust::sort_by_key(thrust::device_ptr<int>(keys), 
                    thrust::device_ptr<int>(keys + numKeys),
                    index.begin());


thrust::permutation_iterator<iit,iit> perm(thrust::device_ptr<int>(values),
                                           index.begin());

现在permvalueskeys排序的顺序返回index,而不会更改原始数据的顺序。

[标准免责声明:所有代码均以浏览器编写,绝不编译或测试。使用风险自负]