sorting - CUDA:如何直接在 GPU 上使用推力::sort_by_key?

标签 sorting cuda thrust

这个问题在这里已经有了答案:





Thrust inside user written kernels

(4 个回答)


5年前关闭。




Thrust 库可用于对数据进行排序。调用可能如下所示(带有键和值向量):

thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin());

在 CPU 上调用,使用 d_keysd_values在 CPU 内存中;大部分执行都发生在 GPU 上。

但是,我的数据已经在 GPU 上了吗?如何使用 Thrust 库直接在 GPU 上执行高效排序,即调用 sort_by_key来自内核的函数?

此外,我的数据由以下任一键组成unsigned long long intunsigned int和数据总是 unsigned int .我应该如何为这些类型发出推力调用?

最佳答案

正如 Talonmies 链接的问题中所述,您不能从 CUDA 函数(例如 __device____global__ )调用 Thrust。但是,这并不意味着您不能通过 Thrust 使用设备内存中已有的数据。相反,您可以使用包装原始数据的推力向量从主机调用所需的推力函数。例如

//raw pointer to device memory
unsigned int * raw_data;
unsigned int * raw_keys;
//allocate device memory for data and keys
cudaMalloc((void **) &raw_data, N_data * sizeof(int));
cudaMalloc((void **) &raw_keys, N_keys * sizeof(int));

//populate your device pointers in your kernel 
kernel<<<...>>>(raw_data, raw_keys, ...);

...

//wrap raw pointer with a device_ptr to use with Thrust functions
thrust::device_ptr<unsigned int> dev_data_ptr(raw_data);
thrust::device_ptr<unsigned int> dev_keys_ptr(raw_keys);

//use the device memory with a thrust call
thrust::sort_by_key(d_keys, d_keys + N_keys, dev_data_ptr);
raw_data指向的设备内存和 raw_keys当你用 Thrust::device_ptr 包裹它们时,它们仍然在设备内存中,因此当您从主机调用 Thrust 函数时,它不必将任何内存从主机复制到设备,反之亦然。也就是说,您使用设备内存直接在 GPU 上进行排序;您将拥有的唯一开销是启动 Thrust 内核和包装原始设备指针。

当然,如果您之后需要在常规 CUDA 内核中使用它们,您可以取回原始指针:
unsigned int * raw_ptr = thrust::raw_pointer_cast(dev_data_ptr);

至于使用 unsigned long long intunsigned int作为您的 key ,数据为 unsigned int ,这不是问题,因为 Thrust 是模板化的。即 sort_by_key 的签名是
template<typename RandomAccessIterator1 , typename RandomAccessIterator2 >
void thrust::sort_by_key(           
    RandomAccessIterator1   keys_first,
    RandomAccessIterator1   keys_last,
    RandomAccessIterator2   values_first )

这意味着您可以为键和数据设置不同的类型。只要您的所有键类型对于给定的调用都是同质的,Thrust 就应该能够自动推断类型,而您不必做任何特殊的事情。希望这是有道理的

关于sorting - CUDA:如何直接在 GPU 上使用推力::sort_by_key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15609126/

相关文章:

c++ - Cuda Thrust内存管理

java - 为什么我会收到这个结果? java

javascript - 在数组中搜索,而不仅仅是唯一值

python - 有没有一种简单的方法来交换矩阵中的行以在左侧形成单位矩阵

C++ 和 Cuda 在 Visual Studio 2013 中的速度

c++ - 有没有一种方法可以使用 Thrust 根据索引 vector 设置标志

c++ - C++ 中的 sort() 可以有 n^2 性能吗?

c - CUDA 的嵌套循环

随机生成器和 CUDA

lambda - CUDA 推力快捷数学函数