Sorting CUDA:如何直接在GPU上使用推力::按_键排序_?
推力库可用于对数据进行排序。调用可能如下所示(带有键和值向量): 在CPU上调用,Sorting CUDA:如何直接在GPU上使用推力::按_键排序_?,sorting,cuda,thrust,Sorting,Cuda,Thrust,推力库可用于对数据进行排序。调用可能如下所示(带有键和值向量): 在CPU上调用,d_键和d_值位于CPU内存中;大部分执行都在GPU上进行 但是,我的数据已经在GPU上了?如何使用推力库直接在GPU上执行有效排序,即从内核调用sort\u by_key函数 此外,我的数据由以下键组成: unsigned long long int或unsigned int以及始终为unsigned int的数据。我应该如何对这些类型进行推力调用?如链接的问题Talonies中所述,您不能从CUDA函数调用推力
d_键
和d_值
位于CPU内存中;大部分执行都在GPU上进行
但是,我的数据已经在GPU上了?如何使用推力库直接在GPU上执行有效排序,即从内核调用sort\u by_key
函数
此外,我的数据由以下键组成:
unsigned long long int
或unsigned int
以及始终为unsigned int
的数据。我应该如何对这些类型进行推力调用?如链接的问题Talonies中所述,您不能从CUDA函数调用推力(例如,\uuuuuu设备\uuuu
或\uu全局\uu
)。然而,这并不意味着您不能使用设备内存中已有的数据。相反,您可以使用包装原始数据的推力向量从主机调用所需推力函数。e、 g
//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);
至于使用unsigned long long int
或unsigned int
作为包含unsigned int
数据的键,这不是问题,因为推力是模板化的。也就是说,sort\u by\u key
的签名是
template<typename RandomAccessIterator1 , typename RandomAccessIterator2 >
void thrust::sort_by_key(
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first )
模板
无效推力::按键排序(
RandomAccessIterator1首先键_,
RandomAccessIterator1最后一个键,
RandomAccessIterator2值(第一个值)
这意味着您可以为键和数据使用不同的类型。只要给定调用的所有键类型都是同质的,推力就应该能够自动推断出这些类型,而不需要做任何特殊的事情。希望这是有意义的@user1760748:下面的答案让你满意吗?如果没有,请说明是否有问题。。。
unsigned int * raw_ptr = thrust::raw_pointer_cast(dev_data_ptr);
template<typename RandomAccessIterator1 , typename RandomAccessIterator2 >
void thrust::sort_by_key(
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first )