奇偶氣泡排序在CUDA上的實現
相信大家都會寫氣泡排序的程式碼。奇偶氣泡排序主要是在偶數次排序時只比較並交換偶數下標的元素和其右邊的元素,奇數次排序時只比較並交換奇數下標的元素和其右邊的元素,總共的比較資料為元素的個數。以六個元素非遞減排序為例,其流程示意如下:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python實現氣泡排序Python排序
- Java實現氣泡排序Java排序
- Golang實現氣泡排序法Golang排序
- Go實現氣泡排序和快速排序Go排序
- go 實現氣泡排序和插入排序Go排序
- 用go實現簡單的氣泡排序Go排序
- php實現 氣泡排序,插入排序,選擇排序PHP排序
- 用JS實現氣泡排序和插入排序JS排序
- java氣泡排序演算法實現Java排序演算法
- 排序——氣泡排序排序
- ForkJoin和氣泡排序組合實現的歸併排序排序
- 氣泡排序排序
- 9. 氣泡排序,以及如何優化氣泡排序,氣泡排序屬於插入排序排序優化
- 排序:氣泡排序&快速排序排序
- Java實現氣泡排序和插入排序演算法Java排序演算法
- js氣泡排序JS排序
- JavaScript氣泡排序JavaScript排序
- 氣泡排序1排序
- 氣泡排序-fusha排序
- 氣泡排序演示排序
- Shell氣泡排序排序
- d氣泡排序排序
- 容器氣泡排序排序
- 氣泡排序法排序
- 氣泡排序(Java)排序Java
- Python 氣泡排序Python排序
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- 淺析氣泡排序排序
- 陣列氣泡排序陣列排序
- Python_氣泡排序Python排序
- 氣泡排序筆記排序筆記
- 氣泡排序(python版)排序Python
- 19_氣泡排序排序
- 函式氣泡排序函式排序
- 排序演算法--氣泡排序排序演算法
- 排序演算法__氣泡排序排序演算法
- 排序演算法–氣泡排序排序演算法
- 選擇排序和氣泡排序排序
- 氣泡排序與選擇排序排序