奇偶氣泡排序在CUDA上的實現

洛欣發表於2010-09-07
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部落格 ” ,連結:http://blog.itpub.net/22785983/viewspace-672910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章