我想知道在一个线程中是否可以使用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会启动其他内核来并行排序吗?
是的,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或更高版本中可用.