如何利用MATLAB並行計算縮短程序運行時間


本來CPU就是雙核,不過以前一直注重算法,沒注意並行計算的問題。今天為了在8核的dell服務器上跑程序才專門看了一下。本身寫的程序就很容易實現並行化,因為beamline之間並沒有考慮相互作用。等於可以拆成n個線程並行,要是有550核的話,估計1ms就算完了。。。

先轉下網上找到的資料。

一、Matlab 並行計算原理梗概

Matlab的並行計算實質還是主從結構的分布式計算。當你初始化Matlab並行計算環境時,你最初的Matlab進程自動成為主節點,同時初始化多個(具體個數手動設定,詳見下文)Matlab計算子節點。Parfor的作用就是讓這些子節點同時運行Parfor語句段中的代碼。Parfor運行之初,主節點會將Parfor循環程序之外變量傳遞給計算子節點。子節點運算過程時互不干擾,運算完畢,則應該有相應代碼將各子節點得到的結果組合到同一個數組變量中,並返回到Matlab主節點。當然,最終計算完畢應該手動關閉計算子節點。

二十六、初始化 Matlab 並行計算環境

這里講述的方法僅針對多核機器做並行計算的情況。設機器的CPU核心數量是CoreNum雙核機器的CoreNum2,依次類推。CoreNum以不等於核心數量,但是如果CoreNum於核心數量則核心利用率沒有最大化,如果CoreNum於核心數量則效率反而可能下降。因此單核機器就不要折騰並行計算了,否則速度還更慢。下面一段代碼初始化Matlab並行計算環境:

%Initialize Matlab Parallel Computing Enviornment by Xaero | Macro2.cn

CoreNum=2; %設定機器CPU核心數量,我的機器是雙核,所以CoreNum=2

if matlabpool('size')<=0 %判斷並行計算環境是否已然啟動

matlabpool('open','local',CoreNum); %若尚未啟動,則啟動並行環境

else

disp('Already initialized'); %說明並行環境已經啟動。

end

 

運行成功后會出現如下語句:

Starting matlabpool using the 'local' configuration ... connected to 2 labs.

如果運行出錯,按照下面的辦法檢測:

首先運行:

matlabpool size

 

如果出錯,說明你沒有安裝Matlab並行工具箱。確認安裝了此工具箱后,運行:

matlabpool open local 2;

如果出錯,證明你的機器在開啟並行計算時設置有問題。請聯系MathWorks的售后服務。

 

二十七、終止 Matlab 並行計算環境

用上述語句啟動Matlab並行計算環境的話,在你的內存里面有CoreNumMatlab進程存在,每個占用內存都在百兆以上。(可以用Windows任務管理器查看),故完成運行計算后可以將其關閉。關閉的命令很簡單:

matlabpool close

二十八、Matlab Monte Carlo 並行的算法

Matlab並行計算比較特別。下圖節選自Matlab並行計算工具箱用戶手冊。這個列表告訴你Matlab如何處理Parfor並行計算程序段中的各種變量。所以寫代碼時要注意不少問題,否則寫出的並行代碼可能還不如非並行的代碼快。

 

MATLAB並行計算 - CD_Keanu - 智慧人生

 

 

這里我推薦大家用MatlabMonte Carlo並行代碼時按照以下注意事項來寫:

1.將Monte Carlo模擬過程中不會改變的參數都寫在Parfor循環塊外面

2.生成隨機數、計算f(x)等過程都寫在Parfor里面

3.不要將V0結果傳遞出Parfor,而是直接計算出V0的均值、方差傳遞出parfor

4.最后用數學公式將傳遞出ParforV0的均值方差組合計算成最終結果

這些事項如何體現到程序中請參照示例代碼文件並結合視頻教程學習。這樣的並行辦法簡單易行,對原始程序沒有太大的改動,同時傳遞變量耗費時間也較少,效率比較高。

另外一個問題就是並行代碼做模擬的次數問題。我們要達到用非並行的代碼做N此模擬所能得到結果的精確程度,在核心為CoreNum並行代碼中,Parfor語句段中只要做N/CoreNum次即可達到。

二十九、將例子改寫為並行代碼

附件中的pareg1.m,……,pareg5.m五個文件分別是前一章五個例子的並行代碼。這里需要提到的是,這五個代碼文件都是用向量化的代碼編寫。原因在於,在前一章大家都看到了,向量化的代碼比循環語句代碼一般快幾十甚至上千倍,所以要提高速度,向量化代碼是最重要的優化方法,並行計算倒是其次。

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

由於要搜索多核運行,找到這個帖子里來了

剛才試了一下,我使用的MATLAB2010可以多核運行的。需要多核多線程跑的算法,在之前要讓matlab在本地建立4個“實驗室”(我的機器是4核,所以是4個)
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
顯示正在進行多核配置,一會說,連接到4個“實驗室”。我理解就是在本地虛擬出4台可以運行matlab的工作站,這樣用分布式計算工具箱可以進行並行計算(matlabpool這個命令好像是在並行計算工具箱里的)。觀察windows任務管理器,可以發現一共有5個MATLAB.exe進程。其中一個占內存較多的,我理解是主控的,他基本不干活,只負責分配,進行計算時他的cpu占用率只有1~2%,剩下四個進程專門用來計算的,跑起來各占cpu 25%左右。看上去還是每個matlab進程單核運算,但是一下開4個進程,所以能把cpu用滿。
如果后續還需要多核運算,就直接用parfor好了,不用每次都用matlabpool命令。那個配置一次就好。
算完了,不再跑了,臨退出時關閉配置就行。
>> matlabpool close
Sending a stop signal to all the labs ... stopped.

下面是我一個M文件的程序,測測4核並行計算和單核計算的差距,很簡單。
function testtime

runtimes = 1e9;
dummy1   = 0;
dummy2   = 0;

%matlabpool local 4

tic
%for x= 1:runtimes;
parfor x= 1:runtimes;
    dummy1 = dummy1 + x;
    dummy2 = 2 * x + 1;
end
toc

plot([1 2], [dummy1, dummy2]);

第一次用普通for語句,單核跑,6.09秒
>> testtime
Elapsed time is 6.094267 seconds.

第二次用parfor語句,4核跑,1.63秒
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
>> testtime
Elapsed time is 1.631350 seconds.
>> matlabpool close

加速比 6.09 / 1.63 = 3.736,將近4倍(還有開銷吧),還比較可觀。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
然后說一下要注意的幾個問題:
1、parfor效果好,但是用起來要注意程序的細節。很多地方都會報錯。比如下標必須為 連續的整數!否則會報下面這個錯誤“The variable xxx in a parfor cannot be classified.”具體可以看parfor幫助文件里面的sliced variables這一節,幫助建議仔細全部看過最好。
2、用了parfor之后,輸出參數用nargout確定,會出錯。不知道為什么。
3、變量在parfor內外的傳進傳出要非常小心,因為並行的關系,依賴循環下標的變量都要仔細考慮。
 
在我的程序里面,用profile監測,
不用並行計算的時候,CPU時間為 84.742 S,
用了並行計算的時候,CPU時間為 15.231 S
加速比達到了5.6!!!!!!
 
Oh my lady gaga!!!!!!
 
雙核E6400,不知道為什么加速比這么恐怖.
 
明天在xeon 5310上面去試試,雙CPU,一共8核,不知道會是什么樣子,估計最多1S。。。。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM