Sorting CUDA:如何直接在GPU上使用推力::按_键排序_?

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函数调用推力

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

在CPU上调用,
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 )