我想知道在线程
中是否可以使用thrust :: sort()__global__
void mykernel(float* array, int arrayLength)
{
int threadID = blockIdx.x * blockDim.x + threadIdx.x;
// array length is vector in the device global memory
// is it possible to use inside the thread?
thrust::sort(array, array+arrayLength);
// do something else with the array
}
如果是,那么sort会启动其他内核来并行排序吗?
答案 0 :(得分:8)
是的,thrust::sort
可以与thrust::seq
执行策略结合使用,在单个CUDA线程中顺序排序数字(或在单个CPU线程内顺序排序):
#include <thrust/sort.h>
#include <thrust/execution_policy.h>
__global__
void mykernel(float* array, int arrayLength)
{
int threadID = blockIdx.x * blockDim.x + threadIdx.x;
// each thread sorts array
// XXX note this causes a data race
thrust::sort(thrust::seq, array, array + arrayLength);
}
请注意,您的示例会导致数据争用,因为每个CUDA线程都会尝试并行对相同的数据进行排序。一个正确的无竞赛程序将根据线程索引对array
进行分区。
此功能所需的thrust::seq
执行政策仅适用于Thrust v1.8或更高版本。
答案 1 :(得分:2)
@aland已经向你推荐earlier answer关于在GPU上调用Thrust的并行算法 - 在这种情况下,提问者只是试图对已经存在于GPU上的数据进行排序;从CPU调用的Thrust可以通过转换为向量的指针来处理GPU驻留数据。
假设您的问题不同,并且您真的想在内核中间调用 parallel 排序(而不是将内核分解为多个较小的内核并在其间调用sort),那么您应该考虑CUB,它提供了适合您目的的各种原语。
更新:另请参阅@ Jared的答案,其中他解释说,从Thrust 1.7开始,您可以在GPU上调用Thrust的顺序算法。