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

CUDA - thrust::sort on device returns only 0's

本文关键字:排序 返回 推力 CUDA      更新时间:2023-10-16

我已经运行了以下推力示例进行排序。问题是在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,是因为你在0RAND_MAX之间生成了大量的随机数,即32 << 20 = 33554432,你正在对它们进行排序,但你只显示其中的32

正如Robert Crovella所提到的,在Windows机器上(OP正在Windows上工作(,RAND_MAX = 2^15-1 = 32767 。因此,你在032767之间生成33554432整数,这意味着你将在原始数组中有大量的0,因此所有0在排序数组的前32个数字中。

我亲自验证了Windows 3264位机器都会发生这种情况,也就是说,在Windows 3264位系统上都RAND_MAX = 32767

同样,正如罗伯特所指出的,这种效果将在 Linux 32 位机器上显示出来,但在 Linux 64 位机器上则不然,对于这种情况,RAND_MAX = 2^31-1因为在这种情况下,RAND_MAX32 << 20大得多。

正如罗伯特所建议的,人们可以改变指令

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

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

以避免全0的表演。