用Parallel For進行並行快速排序

2021-04-28 22:04:57 字數 2503 閱讀 8271

用parallel_for

進行並行快速排序

注:本文主要內容摘自筆者所著的《多核計算與程式設計》一書,略有修改,後續還會繼續發布系列文章,如有需要,可以考慮將一下位址加入到您的瀏覽器收藏夾中:http://software.intel.com/zh-cn/blogs/category/multicore/。

中,實現了parallel_for()功能, parallel_for()可以實現許多的並行區間處理功能,下面以並行快速排序為例來講解如何使用parallel_for()的功能。

要用parallel_for()來進行並行快速排序,需要先繼承crange類來實現乙個cquicksortrange類,然後就可以將cquicksortrange類的例項作為引數傳給parallel_for()進行並行快速排序。

cquicksortrange類的定義如下:

template

class cquicksortrange : public crange ;

在cquicksortrange類中,主要需要實現split()功能。考慮到效率,當區間小於一定值時就用序列的快速排序來對區間進行排序,否則將區間拆分成兩個更小的區間。

split()的**實現如下:

#define min_quicksort_size      512

template

crange * cquicksortrange::split()

int nmid = quicksort_split(m_pdata, m_nbegin, m_nend);

cquicksortrange*prange = new cquicksortrange(m_pdata, nmid+1, m_nend);

m_nend = nmid - 1;

return prange;

}

在split()功能中,呼叫了quicksort()函式和quicksort_split()函式,這兩個函式的**如下:

template

int quicksort_split(t *pdata, int nbegin, int nend)

if ( nhigh != nlow )

while ( ( pdata[nlow] < seldata ) && (nlow != nhigh) )

if ( nlow != nhigh )

}pdata[nlow] = seldata;

return nlow;

}

template

void quicksort(t *pdata, int nbegin, int nend)

if ( nend > nmid )

}

下面**演示了如何使用parallel_for()和cquicksortrange類來進行快速排序。

#definequicksort_data_size     1000000

void main(void)

cquicksortrange*prange

= new cquicksortrange(pdata, 0, quicksort_data_size-1);

parallel_for(prange);

delete pdata;

}在乙個雙核2.66g

cpu機器上,測試了100萬個隨機數的序列快速排序和並行快速排序,得到的效能情況大致如下(由於存在隨機性,每次測試得到的時間可能有差距):

序列快速排序100萬個隨機數, 耗時187ms

並行快速排序100萬個隨機數, 耗時 94ms

加速比為187 / 94 = 1.989

效率為:1.989 / 2 = 99.46%

從上面的效能資料可以充分看出,使用動態任務排程進行並行演算法的效率之高是非常令人興奮的。

1、原子操作在多核程式設計中的使用

2、openmp程式設計指南

3、並行順序搜尋及終止檢測

4、用原子操作解決多執行緒退出問題

5、多核程式設計偽共享問題及其對策

6、多核程式設計鎖競爭問題及其對策

7、程式設計師的十層樓 11

層(上帝)

8、多核分布式佇列的實現:「

偷」與「

自私」的運用

9、多核程式設計中的條件同步模式

10、多核程式設計的四層境界

11、「老子」是偉大的多核計算科學家

12、多核查找-順序查詢也瘋狂

13、多核程式設計文章彙總

14、多核中的動態任務排程

15、用動態任務排程器實現

parallel_for  

周偉明,多核分布式佇列的實現:「

偷」與「

自私」的運用(1

)周偉明,《多核計算與程式設計》 ,華中科技大學出版社,2009.03.

用pam userdb進行vsftpd進行驗證

通常,裝好 rhce as3 4 以後,vsftpd 服務都已經安裝完成。如果安裝 rhce as3 4 時未選擇安裝 vsftpd 你也可以使用 rpm ivh vsftp rpm 使用手動安裝,或者直接去 格式原始碼包,解包後使用 make make install 即可vsftpd 預設使用 ...

用java方法對資料進行根據字段分組並封裝二維陣列

碰到圖表中需要 格式的資料。如是在mybatis框架中可以新建物件,使用 collection collection 封裝物件。而hibernate不知能不能有sql直接處理成二維陣列的方法,但問題總是要快速解決的,於是乎寫了個公共方法,以便使用 後台查詢出 1,2,name1 2,3,name2 ...

用redis SETNX進行加鎖

命令介紹 當 key 不存在,將 key 的值設為 value,返回1說明值被設定,若給定的 key 已經存在,則 setnx 不做任何動作,返回0說明值已經存在。注 setnx 是set if not exists的簡寫。最近用python做簡訊平台時,需限制在同一時間禁止同一手機號連續傳送簡訊的...