我有一组整数值,我想使用Thrust对它们进行排序。是否有可能在此排序中仅使用一些高位/低位。如果可能的话,我不想使用用户定义的比较器,因为它将使用的算法从基数排序更改为合并排序,并且相当多地增加了经过的时间。
我认为当所有数字在某个位上具有相同的值时,在排序时会跳过该位,因此使用尽可能最低的位数并希望它就足够了。 (即:使用8位字符的5位并将高3位设置为0)
示例:
sort<4, 0>(myvector.begin(), myvector.end())
sort<4, 1>(myvector.begin(), myvector.end())
仅使用4位,高位或低位进行排序..
答案 0 :(得分:1)
Thrust的接口抽象出算法实现细节,例如当前排序策略之一是基数排序的事实。由于底层排序实现可能会从版本更改为版本,后端到后端,甚至调用调用,因此用户无法传达要排序的位数。
幸运的是,这种明确的信息通常不是必需的。在适当的时候,Thrust当前的排序实现将检查排序键,并在零位中省略多余的计算。
答案 1 :(得分:0)
如何使用transformer_iterator?
这是一个简短的例子(按第一位排序),你可以为自己的目的编写自己的一元函数。
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/sort.h>
using namespace std;
struct and_func : public thrust::unary_function<int,int>
{
__host__ __device__
int operator()(int x)
{
return 8&x;
}
};
int main()
{
thrust::device_vector<int> d_vec(4);
d_vec[0] = 10;
d_vec[1] = 8;
d_vec[2] = 12;
d_vec[3] = 1;
thrust::sort_by_key(thrust::make_transform_iterator(d_vec.begin(), and_func()),
thrust::make_transform_iterator(d_vec.end(), and_func()),
d_vec.begin());
for (int i = 0; i < 4; i++)
cout<<d_vec[i]<<" ";
cout<<"\n"<<endl;
return 0;
}