如何排序与上推力库密钥精度要求不高(How to sort with less precision

2019-10-16 20:54发布

我有一组整数值的和我想用推力对它们进行排序。 是否有在此排序只使用一些高位/低位成为了可能。 如果可能的话,我不希望使用用户定义的比较,因为它是从基数排序改变所使用的算法合并排序和增加运行时间颇多。

我认为,当所有的数字有一点相同的值,而排序位被跳过,所以它是可行的使用尽可能低的比特数,并希望这将是足够的。 (即:用于使用具有8个比特的炭和高3位设定为0 5个比特)

例:

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

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

同样的事情也给http://www.moderngpu.com/sort/mgpusort.html

Answer 1:

推力的接口抽象了算法的实现细节,比如一个事实,即当前的排序策略之一是基数排序。 由于底层的排序实现可能因版本,后端更改到后端,甚至调用来调用的可能性,也没有办法为用户传达位排序的数量。

幸运的是,这种明确的信息通常是没有必要的。 在适当的时候,推力目前的排序实现将检查排序键和省去不必要的计算之中归零位。



Answer 2:

如何使用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;
}


文章来源: How to sort with less precision on keys with Thrust library