ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 奇偶冒泡排序在CUDA上的实现

奇偶冒泡排序在CUDA上的实现

原创 Linux操作系统 作者:洛欣 时间:2010-09-07 19:33:09 0 删除 编辑
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

相信大家都会写冒泡排序的代码。奇偶冒泡排序主要是在偶数次排序时只比较并交换偶数下标的元素和其右边的元素,奇数次排序时只比较并交换奇数下标的元素和其右边的元素,总共的比较资料为元素的个数。以六个元素非递减排序为例,其流程示意如下:

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE6->5  4->3  2->1            初始数据

5  6->3  4->1  2            0次排序

5 ->3  6->1  4->2            1次

3  5->1  6->2  4            2

3->1  5->2  6->4             3

1  3->2  5->4  6             4

1  2  3  4  5  6            5



Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE         箭头表示要比较并交换的元素对。由示意图可看出,奇数次排序和偶数次排序中,每一对元素的比较并交换都是独立,故可以使用CUDA并行。代码如下:


Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE//number of thread == len/2, len must be even

__global__ void even(int *d_input, const int len){

         int id = blockDim.x*blockIdx.x + threadIdx.x;

        

         if(id >= len/2)

                   return;

                  

         if(d_input[2*id] > d_input[2*id+1])

                   swap(d_input + 2*id, d_input + 2*id + 1);

}

//number of thread == len/2 - 1

__global__ void odd(int *d_input, const int len){

         int id = blockDim.x*blockIdx.x + threadIdx.x;

        

         if(id >= len/2 - 1)

                   return;

                  

         if(d_input[2*id + 1] > d_input[2*id  + 2])

                   swap(&d_input[2*id + 1], &d_input[2*id + 2]);

}


Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE由于每个线程做的事情比较少(如果线程处理的元素对本身就是有序的,线程什么事都不做),因此其加速有限。此代码适合处理那种像近似完全反序的数组


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22785983/viewspace-672910/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-11-12

  • 博文量
    111
  • 访问量
    273827