淺談多核cpu、多線程與并行計算

淺談多核cpu、多線程與并行計算

ID:12635818

大?。?2.00 KB

頁數(shù):3頁

時間:2018-07-18

淺談多核cpu、多線程與并行計算_第1頁
淺談多核cpu、多線程與并行計算_第2頁
淺談多核cpu、多線程與并行計算_第3頁
資源描述:

《淺談多核cpu、多線程與并行計算》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫

1、0.前言最近發(fā)覺自己博客轉帖的太多,于是決定自己寫一個原創(chuàng)的。筆者用過MPI和C#線程池,參加過比賽,有所感受,將近一年來,對多線程編程興趣一直不減,一直有所關注,決定寫篇文章,算是對知識的總結吧。有說的不對的地方,歡迎各位大哥們指正:)1.CPU發(fā)展趨勢核心數(shù)目依舊會越來越多,依據(jù)摩爾定律,由于單個核心性能提升有著嚴重的瓶頸問題,普通的桌面PC有望在2017年末2018年初達到24核心(或者16核32線程),我們如何來面對這突如其來的核心數(shù)目的增加?編程也要與時俱進。筆者斗膽預測,CPU各個核心之間的片內總線將會采用4路組相連:),因為全相連太過復雜,單總線又不夠給力。而且應該是非

2、對稱多核處理器,可能其中會混雜幾個DSP處理器或流處理器。2.多線程與并行計算的區(qū)別(1)多線程的作用不只是用作并行計算,他還有很多很有益的作用。還在單核時代,多線程就有很廣泛的應用,這時候多線程大多用于降低阻塞(意思是類似于while(1){if(flag==1)break;sleep(1);}這樣的代碼)帶來的CPU資源閑置,注意這里沒有浪費CPU資源,去掉sleep(1)就是純浪費了。阻塞在什么時候發(fā)生呢?一般是等待IO操作(磁盤,數(shù)據(jù)庫,網(wǎng)絡等等)。此時如果單線程,CPU會干轉不干實事(與本程序無關的事情都算不干實事,因為執(zhí)行其他程序對我來說沒意義),效率低下(針對這個程序而

3、言),例如一個IO操作要耗時10毫秒,CPU就會被阻塞接近10毫秒,這是何等的浪費啊!要知道CPU是數(shù)著納秒過日子的。所以這種耗時的IO操作就用一個線程Thread去代為執(zhí)行,創(chuàng)建這個線程的函數(shù)(代碼)部分不會被IO操作阻塞,繼續(xù)干這個程序中其他的事情,而不是干等待(或者去執(zhí)行其他程序)。同樣在這個單核時代,多線程的這個消除阻塞的作用還可以叫做“并發(fā)”,這和并行是有著本質的不同的。并發(fā)是“偽并行”,看似并行,而實際上還是一個CPU在執(zhí)行一切事物,只是切換的太快,我們沒法察覺罷了。例如基于UI的程序(俗話說就是圖形界面),如果你點一個按鈕觸發(fā)的事件需要執(zhí)行10秒鐘,那么這個程序就會假死

4、,因為程序在忙著執(zhí)行,沒空搭理用戶的其他操作;而如果你把這個按鈕觸發(fā)的函數(shù)賦給一個線程,然后啟動線程去執(zhí)行,那么程序就不會假死,繼續(xù)相應用戶的其他操作。但是,隨之而來的就是線程的互斥和同步、死鎖等問題,詳細見有關文獻?,F(xiàn)在是多核時代了,這種線程的互斥和同步問題是更加嚴峻的,單核時代大都算并發(fā),多核時代真的就大為不同,為什么呢?具體細節(jié)請參考有關文獻。我這里簡單解釋一下,以前volatile型變量的使用可以解決大部分問題,例如多個線程共同訪問一個Flag標志位,如果是單核并發(fā),基本不會出問題(P.S.在什么情況下會出問題呢?Flag有多個,或者是一個數(shù)組,這時候只能通過邏輯手段搞定這個

5、問題了,多來幾次空轉無所謂,別出致命問題就行),因為CPU只有一個,同時訪問這個標志位的只能有一個線程,而多核情況下就不太一樣了,所以僅僅volatile不太能解決問題,這就要用到具體語言,具體環(huán)境中的“信號量”了,Mutex,Monitor,Lock等等,這些類都操作了硬件上的“關中斷”,達到“原語”效果,對臨界區(qū)的訪問不被打斷的效果,具體就不解釋了,讀者可以看看《現(xiàn)代操作系統(tǒng)》。(2)并行計算還可以通過其他手段來獲得,而多線程只是其中之一。其他手段包括:多進程(這又包括共享存儲區(qū)的和分布式多機,以及混合式的),指令級并行。ILP(指令級并行),x86架構里叫SMT(同時多線程),

6、在MIPS架構里與之對應的是superscalar(超標量)和亂序執(zhí)行,二者有區(qū)別,但共同點都是可以達到指令級并行,這是用戶沒法控制的,不屬于編程范圍,只能做些有限的優(yōu)化,而這有限的優(yōu)化可能只屬于編譯器管轄的范疇,用戶能做的甚少。(3)典型的適于并行計算的語言Erlang和MPI:這兩個前者是語言,后者是C++和Fortran的擴展庫,效果是一樣的,利用多進程實現(xiàn)并行計算,Erlang是共享存儲區(qū)的,MPI是混合型的。C#.NET4.0:新版本4.0可以用少量代碼實現(xiàn)并行For循環(huán),之前版本需要用很繁瑣的代碼才能實現(xiàn)同樣功能。這是利用了多線程實現(xiàn)并行計算。Java和C#3.5都有線程

7、池(ThreadPool),也是不錯的很好用的多線程管理類,可以方便高效的使用多線程。CUDA,還是個初生牛犢,有很大的發(fā)展?jié)摿?,只不過就目前其應用領域很有限。其目前只能使用C語言,而且還不是C99,比較低級,不能使用函數(shù)指針。個人感覺這由于硬件上天生的局限性(平均每個核心可用內存小,與系統(tǒng)內存通訊時間長),只適用于做科學計算,靜態(tài)圖像處理,視頻編碼解碼,其他領域,還不如高端CPU。等以后GPU有操作系統(tǒng)了,能充分調度GPU資源了,GPU就可以當大神了。游

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內容,確認文檔內容符合您的需求后進行下載,若出現(xiàn)內容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。