【CUDA自带实例学习】1.快速排序

自带的实例较多无意义代码,包括选择是否显示随机初始化的待排序数组,选择是否显示设备信息等代码,较为简单,从略。

实际在设备上排序的代码一共两个:

__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之间的操作是可以并行执行的,递归可以并行执行。

你可能感兴趣的:(cuda)