CUDA - 推力::设备上的排序仅返回 0
CUDA - thrust::sort on device returns only 0's
我已经运行了以下推力示例进行排序。问题是在thrust::sort
之后,输出包含所有0
。
请告诉我这里出了什么问题。
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/sort.h>
#include <cstdlib>
#include <iostream>
using namespace std;
int main(void)
{
thrust::host_vector<int> h_vec(32 << 20);
thrust::generate(h_vec.begin(), h_vec.end(), rand);
thrust::device_vector<int> d_vec=h_vec;
for(int i = 0; i<32;i++)
cout<<d_vec[i]<<endl;
cout<<endl<<endl<<endl;
thrust::sort(d_vec.begin(), d_vec.end());
for(int i = 0; i<32;i++)
cout<<d_vec[i]<<endl;
cout<<endl<<endl<<endl;
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
for(int i = 0; i<32;i++)
cout<<h_vec[i]<<endl;
return 0;
}
你之所以观察所有0
,是因为你在0
和RAND_MAX
之间生成了大量的随机数,即32 << 20 = 33554432
,你正在对它们进行排序,但你只显示其中的32
。
正如Robert Crovella所提到的,在Windows机器上(OP正在Windows上工作(,RAND_MAX = 2^15-1 = 32767
。因此,你在0
和32767
之间生成33554432
整数,这意味着你将在原始数组中有大量的0
,因此所有0
在排序数组的前32
个数字中。
我亲自验证了Windows 32
和64
位机器都会发生这种情况,也就是说,在Windows 32
和64
位系统上都RAND_MAX = 32767
。
同样,正如罗伯特所指出的,这种效果将在 Linux 32
位机器上显示出来,但在 Linux 64
位机器上则不然,对于这种情况,RAND_MAX = 2^31-1
因为在这种情况下,RAND_MAX
比32 << 20
大得多。
正如罗伯特所建议的,人们可以改变指令
thrust::host_vector<int> h_vec(32 << 20);
自
thrust::host_vector<int> h_vec(min(32 << 20,RAND_MAX));
以避免全0
的表演。
相关文章:
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- C++ 合并排序返回原始向量
- 算法中的排序函数返回错误
- 排序函数未正确返回数组
- 合并排序返回错误的值
- 从排序的数字数组中返回数字范围的最快方法是什么?
- 使用霍尔分区方案的快速排序算法返回原始未排序列表
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- 为什么我的选择排序返回原始向量中不在的值
- 如何按值对**boost::unorderede_map**进行排序,并按该顺序仅返回键
- c++std::使用函数返回值对std::向量进行排序
- 为什么一位数组返回零?合并排序测试
- 返回指向排序列表的指针;C++中的链表
- 为什么我的合并排序实现返回奇怪的数字
- 当前尝试使用气泡排序对数组进行排序,然后获取平均值,但返回的平均值是错误的
- std::使用个人类排序返回分段错误
- 不知道如何从气泡排序函数返回值
- 如何在std::map上迭代返回基于键值排序的元素
- 对文件进行排序/返回信息