在线程中使用thrust :: sort

时间:2014-05-01 07:18:55

标签: cuda thrust

我想知道在线程

中是否可以使用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会启动其他内核来并行排序吗?

2 个答案:

答案 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的顺序算法。