如何使用Thrust库对键进行精度较低的排序

时间:2012-06-13 09:33:38

标签: sorting cuda thrust radix-sort

我有一组整数值,我想使用Thrust对它们进行排序。是否有可能在此排序中仅使用一些高位/低位。如果可能的话,我不想使用用户定义的比较器,因为它将使用的算法从基数排序更改为合并排序,并且相当多地增加了经过的时间。

我认为当所有数字在某个位上具有相同的值时,在排序时会跳过该位,因此使用尽可能最低的位数并希望它就足够了。 (即:使用8位字符的5位并将高3位设置为0)

示例:

sort<4, 0>(myvector.begin(), myvector.end())
sort<4, 1>(myvector.begin(), myvector.end())

仅使用4位,高位或低位进行排序..

类似的东西 http://www.moderngpu.com/sort/mgpusort.html

2 个答案:

答案 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;
}