gpt4 book ai didi

c++ - CUDA - thrust::sort 在设备上仅返回 0

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:48 29 4
gpt4 key购买 nike

我运行了以下 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 3264位机,即在两个 Windows 上 3264位系统 RAND_MAX = 32767 .

同样,正如 Robert 所指出的,这种效果将在 Linux 上显示 32 bit 机器,但不在 Linux 上 64位机,为此 RAND_MAX = 2^31-1因为,对于那种情况,RAND_MAX32 << 20 大得多.

按照 Robert 的建议,可以更改指令

thrust::host_vector<int> h_vec(32 << 20);

thrust::host_vector<int> h_vec(min(32 << 20,RAND_MAX));

避免所有0的节目。

关于c++ - CUDA - thrust::sort 在设备上仅返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23211509/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com