C++并行程序開(kāi)發(fā)簡(jiǎn)介

前陣子用兩種方法實(shí)現(xiàn)了一個(gè)算法,第一個(gè)方法只用CPU完成計(jì)算,第二個(gè)方法用到了GPU。被運(yùn)行結(jié)果嚇了一跳,GPU比我單機(jī)CPU跑的程序快了一百倍。既然并行計(jì)算對(duì)性能的提升真不是蓋的,于是決定把CPU的程序也改成并行的。今天簡(jiǎn)單介紹一下Linux下用C++開(kāi)發(fā)并行程序的方法。

使用C++在Linux下開(kāi)發(fā)并行程序要調(diào)用一個(gè)頭文件,它里面提供了很多實(shí)現(xiàn)并行運(yùn)算的函數(shù)。調(diào)用它的方法就是在文件開(kāi)頭添加:

#include

有了這個(gè)頭文件之后,就可以開(kāi)始我們的C++并行化之旅了。

首先,我覺(jué)得有必要看看服務(wù)器上有多少個(gè)CPU。方法很簡(jiǎn)單,pthread.h提供了一個(gè)函數(shù)叫sysconf(int),用它可以查看系統(tǒng)配置的參數(shù)。參數(shù)是_SC_NPROCESSORS_CONF的時(shí)候表示查看系統(tǒng)的CPU個(gè)數(shù)。于是我們可以寫(xiě)這樣一個(gè)程序

#include”stdio.h”

#include”pthread.h”

int main(int argv, char* argc[])

{

cout<

return 0;

}

運(yùn)行結(jié)果如下:

可以看出我用的服務(wù)器里面有32個(gè)CPU。給sysconf()傳其他的參數(shù)就可以查看系統(tǒng)相應(yīng)的參數(shù),有興趣可以網(wǎng)上搜一下各種參數(shù)的介紹。

需要注意一點(diǎn),使用pthread.h的時(shí)候需要在編譯命令后面加–lpthread,否則的話編譯器不能識(shí)別pthread.h里面的函數(shù),就像下面這樣:

我以前寫(xiě)過(guò)一篇介紹Linux編程基本知識(shí)的帖子,如果對(duì)上圖中的命令不太理解的話可以參照一下。

pthread.h是利用函數(shù)實(shí)現(xiàn)多線程的:程序猿把需要線程完成的任務(wù)寫(xiě)成到一個(gè)函數(shù)里。如果直接運(yùn)行這些函數(shù),那么他們?nèi)匀幌褚郧耙粯佣际琼樞驁?zhí)行的。但如果用pthread.h提供的方法去調(diào)用這個(gè)函數(shù),它就會(huì)變成一個(gè)獨(dú)立的線程了。下面舉個(gè)栗子:

我們準(zhǔn)備寫(xiě)兩個(gè)線程,第一個(gè)線程顯示十次:“我是一號(hào)線程”,另一個(gè)線程顯示十次“我是二號(hào)線程”??梢韵胂?,如果直接調(diào)用兩個(gè)函數(shù),我們會(huì)看到十次“我是一號(hào)線程”,然后看到緊接著的十個(gè)“我是二號(hào)線程”。如果我們用pthread.h提供的方法調(diào)用他們會(huì)有什么效果呢?直接看運(yùn)行效果:

多看幾次就更清楚了:

發(fā)現(xiàn)了吧,兩個(gè)線程的執(zhí)行順序是不確定的。這就是并行計(jì)算的效果:各各線程之間獨(dú)立運(yùn)行,齊頭并進(jìn)??梢韵胂?,如果能把一個(gè)大任務(wù)分解成若干獨(dú)立的小任務(wù),然后使用并行計(jì)算的方法,運(yùn)算速度將會(huì)大大提高。

現(xiàn)在解釋一下上面的例子是怎么實(shí)現(xiàn)的:

首先定義兩個(gè)函數(shù),task1和task2,他們是兩個(gè)線程的主體,然后在main函數(shù)里使用pthread.h提供的方法調(diào)用task1和task2。產(chǎn)生新線程的方法可以被比喻成放風(fēng)箏。在放風(fēng)箏的時(shí)候,我們通過(guò)一根線來(lái)控制風(fēng)箏,以防止它亂飛。同樣,我們也不希望產(chǎn)生的線程亂運(yùn)行,需要一根線來(lái)控制新的線程,pthread_t就是pthread.h提供給我們的控制線,它記錄新線程的編號(hào)。顧名思義,pthread_create就是產(chǎn)生新線程的過(guò)程了。在上面的例子中,我們使用pthread_create把task1和task2變成了兩個(gè)獨(dú)立的線程,并用ThreadA和ThreadB記錄他們的線程號(hào)。pthread_join的意思是main函數(shù)在此等待ThreadA和ThreadB記錄的線程運(yùn)行結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容