1

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

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

例子:

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

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

类似于 http://www.moderngpu.com/sort/mgpusort.html

4

2 回答 2

1

Thrust 的接口抽象出算法实现细节,例如当前排序策略之一是基数排序这一事实。由于底层排序实现可能会从版本到版本、后端到后端,甚至调用到调用,因此用户无法传达要排序的位数。

幸运的是,通常不需要这种明确的信息。在适当的时候,Thrust 的当前排序实现将检查排序键并在零位中省略多余的计算。

于 2012-08-26T22:25:47.713 回答
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;
}
于 2012-06-20T19:31:33.683 回答