Matlab并行計(jì)算方法(上)

? ? ? ?Matlab是被廣泛使用的商業(yè)編程軟件,對(duì)應(yīng)的M語(yǔ)言也是公認(rèn)的簡(jiǎn)單易上手的好語(yǔ)言,其數(shù)組運(yùn)算能力十分強(qiáng)大,天生就適合科學(xué)計(jì)算,不過(guò)它有一個(gè)天生的問(wèn)題,就是,運(yùn)行相同代碼的速度,通常都比CC++等語(yǔ)言慢上許多,不過(guò)根據(jù)我自己的編程經(jīng)驗(yàn),Matlab的運(yùn)行速度并不比Python慢,有時(shí)候甚至?xí)闯?code>Linux下Matlab的運(yùn)行速度要比Windows下快上許多),這樣一來(lái),有時(shí)候我們需要進(jìn)行一些反復(fù)的操作(比如參數(shù)掃描)的時(shí)候,用單核運(yùn)算的速度就相對(duì)較慢了,優(yōu)化代碼確實(shí)可以提速;不過(guò)這里不談代碼如何優(yōu)化,而是另一種加速方法:并行計(jì)算。

? ? ? ?并行計(jì)算道理很簡(jiǎn)單,就是說(shuō):你有一個(gè)任務(wù),現(xiàn)在要把這個(gè)任務(wù)反復(fù)做10遍,你一個(gè)人做,只能一遍一遍的來(lái);但是,要是有10個(gè)人一起做,那就只需要做一遍的時(shí)間,這就是并行計(jì)算。

? ? ? ?科研中經(jīng)常遇到需要并行計(jì)算的程序,如何編寫(xiě)程序?下面介紹兩種方法:


? ? ? ?注意:以下的并行計(jì)算方法都需要安裝工具包Parallel Computing Toolbox,據(jù)我所知,這個(gè)工具包破解版的Matlab都是有的;至于正版的Matlab,如果以前沒(méi)有安裝,那么可以打開(kāi)Matlab,在“主頁(yè)---附加功能---獲取附加功能”中搜尋安裝。

? ? ? ?打開(kāi)matlab,如果在窗口左下角出現(xiàn)這個(gè)四個(gè)豎杠的圖標(biāo),就說(shuō)明安裝成功:

并行池

1、parfor并行

? ? ? ?第一種方式是比較方便快捷的parfor并行方式,代碼框架如下:

 %% 準(zhǔn)備工作
 % 指定你要開(kāi)啟的線程數(shù)量,開(kāi)啟進(jìn)程池
 core = 5
 p = parpool(core)
 % 自行設(shè)定程序最大運(yùn)行時(shí)間
 p.IdleTimeout = 100;
 ?
 %% 實(shí)際并行計(jì)算
 ?
 % 一個(gè)用來(lái)記錄數(shù)據(jù)的數(shù)組
 data = zeros(1,5)

 % 并行循環(huán)
 parfor i = 1:5
  % 調(diào)用你自己編寫(xiě)的某個(gè)函數(shù)testFunction并返回了某個(gè)結(jié)果a
  a = testFunction(i)
  data(i) = a
 end
 ?
 % 關(guān)閉進(jìn)程池
 delete(p)

%% 自定義的函數(shù):輸入值為i;輸出值為a
function a = testFunction(i)
***
***
a = your_answer;
end



簡(jiǎn)單來(lái)說(shuō),就是:


  • 開(kāi)啟進(jìn)程池,指定核心數(shù)、運(yùn)行時(shí)間等參數(shù)

  • 設(shè)定接受結(jié)果的矩陣

  • parfor并行運(yùn)算

  • 結(jié)束后關(guān)閉進(jìn)程池


? ? ? ?需要注意的是,在使用parfor并行計(jì)算時(shí),很容易就會(huì)提示錯(cuò)誤編寫(xiě),這是因?yàn)槊總€(gè)核(好像線程更加準(zhǔn)確些)在運(yùn)行時(shí)都應(yīng)該是獨(dú)立在運(yùn)行自己的程序,也就是說(shuō)你的并行運(yùn)算程序不能相互有數(shù)據(jù)傳遞操作。要是你想傳遞數(shù)據(jù),那我也不會(huì),因?yàn)槲覐膩?lái)都不這樣編程。

? ? ? ?parfor并行運(yùn)算非常的優(yōu)雅且實(shí)用,適用范圍是在你自己的臺(tái)式機(jī)或者筆記本上,parpool()開(kāi)啟之后的worker數(shù)是默認(rèn)的機(jī)器線程數(shù)量,如下圖所示:

并行計(jì)算屬性

? ? ? ?這里的幾個(gè)性質(zhì)可以自行改動(dòng),由于我的電腦比較老,所以只有4個(gè)線程。

? ? ? ?這種并行計(jì)算的好處是簡(jiǎn)單易學(xué)、也不用去管核與核之間的消息分發(fā)和回收,因此本人強(qiáng)烈推薦!

? ? ? ?另外,通過(guò)點(diǎn)擊那個(gè)左下角的豎線圖標(biāo)也是打開(kāi)進(jìn)程池的,不過(guò)用程序控制還是能動(dòng)性更大些。

? ? ? ?還有問(wèn)題的朋友,可以參考:matlab并行計(jì)算,這個(gè)寫(xiě)的比較詳細(xì),推薦大家看看。

2、集群并行計(jì)算

? ? ? ?每次跑并行我都會(huì)想,4核?8核?這怎么夠?!我有幾百個(gè)參數(shù)要掃描!這怎么辦?

? ? ? ?那答案很簡(jiǎn)單啊,當(dāng)然是上剛剛發(fā)布的第三代線程撕裂者3960X套裝啦!

第三代線程撕裂者

? ? ? ?24核48線程,TDP280W,zen2架構(gòu),超頻上5G,秒飛Intel全家!

? ? ? ?如果覺(jué)得這么貴的東西并不適合我們,那么3950x還是可以考慮的,畢竟也有16個(gè)核心在那里擺著......

? ? ? ?開(kāi)個(gè)玩笑,這種堆料堆錢(qián)沒(méi)有啥意思,要謹(jǐn)記:

買(mǎi)前生產(chǎn)力,買(mǎi)后打游戲

? ? ? ?你要打游戲,買(mǎi)3600就可以了,6核12線程,這價(jià)位,還要什么自行車(chē)。


? ? ? ?話說(shuō)回來(lái),在服務(wù)器上進(jìn)行Matlab并行計(jì)算要復(fù)雜一些,有關(guān)此內(nèi)容,我會(huì)在下節(jié)再講,等不及的朋友,直接去MathWorks官網(wǎng)上查詢parclustercreateTask、createJobsubmit等等幾個(gè)關(guān)鍵函數(shù),相信看完之后,應(yīng)該會(huì)有所收獲。

? ? ? ?謝謝各位的閱讀!

最后編輯于
?著作權(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ù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

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