在线程中使用thrust :: sort

Bor*_*xis 5 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
}
Run Code Online (Sandbox Code Playgroud)

如果是,那么sort会启动其他内核来并行排序吗?

Jar*_*ock 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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的示例会导致数据争用,因为每个CUDA线程都会尝试并行对相同的数据进行排序.一个正确的无竞争程序将array根据线程索引进行分区.

thrust::seq此功能所需的执行策略仅在Thrust v1.8或更高版本中可用.