自带的实例较多无意义代码,包括选择是否显示随机初始化的待排序数组,选择是否显示设备信息等代码,较为简单,从略。
实际在设备上排序的代码一共两个:
__device__ void selection_sort(unsigned int *data, int left, int right)
__global__ void cdp_simple_quicksort(unsigned int *data, int left, int right, int depth)
在kernel中使用递归实现排序,当递归的深度depth大于设定的MAX_DEPTH或者当待排序的数组长度较小时(小于设定的INSERTION_SORT),此时直接调用简单的选择排序:
__device__ void selection_sort(unsigned int *data, int left, int right)函数。
否则递归进行快速排序,其中用到了cuda stream对象来确保递归调用的同步:
if (left < (rptr-data))
{
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
cdp_simple_quicksort<<< 1, 1, 0, s >>>(data, left, nright, depth+1);
cudaStreamDestroy(s);
}
if ((lptr-data) < right)
{
cudaStream_t s1;
cudaStreamCreateWithFlags(&s1, cudaStreamNonBlocking);
cdp_simple_quicksort<<< 1, 1, 0, s1 >>>(data, nleft, right, depth+1);
cudaStreamDestroy(s1);
}
主机端调用kernel时使用函数cudaDeviceSynchronize()确保当设备中所有stream中的操作都结束以后(计算,数据传输)才返回主机线程。
cudaStream_t 用来声明对象,然后创建stream对象,每一个递归调用的kernel都使用一个新生成的stream。不同的stream之间的操作是可以并行执行的,递归可以并行执行。