我运行了以下 Thrust 示例进行排序。问题是在 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
的原因问题是您正在生成大量随机数,即 32 << 20 = 33554432
,0
之间和RAND_MAX
,您正在订购它们,但仅显示 32
其中。
正如 Robert Crovella 所提到的,在 Windows 计算机上(OP 在 Windows 上运行),RAND_MAX = 2^15-1 = 32767
。因此,您将生成 33554432
0
之间的整数和32767
,这意味着您将拥有大量 0
在原始数组中,所以所有 0
在第一个32
已排序数组的编号。
我亲自验证了这两种情况都会发生,Windows 32
和64
位机器,即在两个 Windows 上 32
和64
位系统RAND_MAX = 32767
.
同样,正如 Robert 所指出的,这种效果将在 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
的节目。
关于c++ - CUDA - 设备上的推力::排序仅返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23211509/