用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做簡訊平台時,需限制在同一時間禁止同一手機號連續傳送簡訊的...