如何使用 Thrust 库以较低的精度对键进行排序
Posted
技术标签:
【中文标题】如何使用 Thrust 库以较低的精度对键进行排序【英文标题】:How to sort with less precision on keys with Thrust library 【发布时间】:2012-06-13 09:33:37 【问题描述】:我有一组整数值,我想使用 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
【问题讨论】:
没有明确的方法可以做到这一点,通常也没有必要。thrust::sort
的基数排序将检查数据并忽略零位中的多余通道。
是的,当我对向量进行排序时,我会根据包含的值得到不同的经过时间值。即使包含的值相同,但当容器的类型是 int、short 或 byte 时,我也会得到不同的经过时间值。当数字被签名时,它只会增加一点。但正如你所说,它省略了全为零的位。
我认为@JaredHoberock 的评论是一个足够的答案。如果您将评论转换为答案,我可以将其指定为接受的答案。
【参考方案1】:
Thrust 的接口抽象出算法实现细节,例如当前排序策略之一是基数排序这一事实。由于底层排序实现可能会从版本到版本、后端到后端,甚至调用到调用,因此用户无法传达要排序的位数。
幸运的是,通常不需要此类明确的信息。在适当的时候,Thrust 的当前排序实现将检查排序键并在零位中省略多余的计算。
【讨论】:
【参考方案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;
【讨论】:
不,thrust::sort
不能与 transform_iterator
一起使用。 transform_iterator
通常是不可变的。
事实上,我确实将值除以 2 的幂,或者在排序之前将它们转换为更简单的类型......我的初始值是浮点值,我会缩放它们并转换为短类型。我不确定将浮点值转换为短类型并对它们进行排序是否是过度优化尝试..
感谢@JaredHoberock 指出我的错误,我以前从未注意到这一点。以上是关于如何使用 Thrust 库以较低的精度对键进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何让 AVCaptureSessionpresetPhoto 以较低的分辨率拍照?
以高分辨率从网络摄像头捕获图片,同时使用 DirectShow.Net 以较低的分辨率进行预览