c++ - CUDA - 设备上的推力::排序仅返回 0

标签 c++ sorting cuda thrust

我运行了以下 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 = 335544320之间和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位机器,但不适用于 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/

相关文章:

asynchronous - 在 CUDA 程序中禁用所有异步执行

c++ - 使用std::sort时如何理解此结果?

c++ - WAVE 文件的恐惧失败

arrays - 基于字符串数组对自定义数组进行排序

arrays - 在 New Swift 中对二维数组进行排序,之前的排序不起作用

c - 使用 CUDA 的矩阵乘法 :Wrong output

cuda - 在 Cuda (nvcc) 中关闭文件指针

c++ - 从 QSettings 读取自定义元类型数组

c# - Protobuf.NET 使用

sorting - Cassandra - 分页解决方案的数据排序?