我想知道在一个线程中是否可以使用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会启动其他内核来并行排序吗?
是的,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或更高版本中可用.
| 归档时间: |
|
| 查看次数: |
3094 次 |
| 最近记录: |