有關《gpu並行程式設計》(英文《
cuda programming
a developer』s guide to parallel computing with gpus》) 第六章 中基數排序,其中並行排序的多執行緒排序,由於沒有具體較為詳細的介紹,對於初次接觸多執行緒的人略微困難。本文較為詳細的介紹此多執行緒基數排序**。
一:在解釋多執行緒的**之前,先解釋下單執行緒的序列**,如下:
__host__ void cpu_sort(u32 * const data,const u32 num_elements)
else
}// copy data back to source - first the zero list
for (u32 i=0; i
序列**執行過程,假設有 4 個整型資料元素的陣列 data ,並建立兩臨時空間cpu_tmp_0,cpu_tmp_1 如下圖:
只知考慮外迴圈bit=0時的迴圈情況,內層迴圈變數data中所有元素,執行過程如下圖:
記憶體迴圈首先訪問第乙個元素4,判斷4的末尾bit是0,所有將元素4儲存到cpu_tmp_0的第乙個位置;然後訪問第二個元素3,判斷3的末尾bit是1,所有將元素3儲存到cpu_tmp_1的第乙個位置;以此類推:以此方位第
三、四個元素,分別儲存到cpu_tmp_0、cpu_tmp_1的第二個位置。最後先將cpu_tmp_0的元素拷貝到data中對應位置中,在拷貝cpu_tmp_1中的元素。
當bit為其它值是,內層迴圈重複之前的計算過程。這個計算完成之後形成
乙個有序序列!
二:如果理解的單執行緒的計算過程,那麼多執行緒與單執行緒的
區別在於:
1、每個執行緒訪問的元素不再連續的,而是步長為n,n為執行緒總數。
2、計算結束之後,形成了n個有序的序列。
先看下多執行緒**,如下:
__device__ void radix_sort(u32 * const sort_tmp,const u32 num_lists,
const u32 num_elements,const u32 tid,
u32 * const sort_tmp_0,u32 * const sort_tmp_1)
else}}
// copy data back to source - first the zero list
for (u32 i=0; i在多執行緒中變數 base_cnt_0,base_cnt_1為每個執行緒私有變數,每個執行緒的步長為
num_lists,num_lists在這裡等於block中的執行緒數 。
在這裡也只知考慮外迴圈bit=0時的迴圈情況,假設內層迴圈變數sort_tmp中共有如上所示16個元素,假設只有1個block,block中有4個執行緒,那麼總共就是4個執行緒。那麼
num_lists的值就是4,即:每個執行緒的步長是4.
如上圖所示,4個執行緒每個執行緒處理乙個元素,每次迴圈就會處理4個元素。共有16個元素,也就是迴圈4次。0號執行緒只處理索引為0、4、8、12的元素(紅色塊),同理,1號執行緒只處理索引是1、5、9、13(黃色快);2號執行緒只處理索引為2、6、10、14的元素(藍色快);3號執行緒只處理索引為3、7、11、15的元素(綠色塊)。
只看0號執行緒,紅色塊部分,處理過程,如下圖:
0號執行緒只處理紅色塊的資料元素,且只能將sort_tmp中元素存放到,sort_tmp_0和sort_tmp_1中對應的紅色位置內,最後在將sort_tmp_0和sort_tmp_1中的元素拷貝回sort_tmp。
同理,對於1、2、3號執行緒結果如下,
這是bit=0的結果,bit為其它值,處理過程也是一樣的。最終將會得到4個有序的序列。即:紅、黃、藍、綠色塊分別組成的序列。
至此基數排序結束。當然要想得到最後的乙個完成的有序序列,則需後面章節講到的-合併。
(完)
基數排序 RadixSort
基數排序 以整形為例 將整形10進製按每位拆分,然後從低位到高位依次比較各個位。主要分為兩個過程 1 分配,先從個位開始,根據位值 0 9 分別放到0 9號桶中 比如53,個位為3,則放入3號桶中 2 收集,再將放置在0 9號桶中的資料按順序放到陣列中 重複 1 2 過程,從個位到最高位 比如32位...
基數排序 Radix Sort
基數排序是在某種情況下比快速排序還快的排序.當然了,計數排序 counting sort 也有可能比快速排序快.計數排序非常容易理解,時間複雜度是o max a i 如果資料範圍很小的話,計數排序有巨大優勢.而基數排序,則更進一步,對每一位進行計數排序.這樣時間複雜度降為o n log max a ...
基數排序(radix sort)
基數排序的發明可以追溯到1887年赫爾曼何樂禮在打孔卡片製表機上的貢獻。實現原理 將所有待比較的正整數統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始進行基數字10的計數排序,一直到最高位計數排序完後,數列就變成了乙個有序數列 利用了計數排序的穩定性 include includeus...