1 我們知道MATLAB支持並行運行一般有四種模式:
第一種模式:本機調用多核CPU性能並行運算
第二種模式:本機調用GPU性能並行運算
第三種模式:多計算機組成集群,調用集群CPU性能並行運算
第四種模式:運用MATLAB提供的雲計算服務。
2 在第一種並行運算模式中:
標准模式為:
第一步:打開並行池parpool
第二步:parfor等相關PCT,並行計算工具箱中函數
第三步:關閉並行池
3 第一步:打開並行池的方式:
1)p = parpool('local',2); % 在知道有幾個本地核的情況下,選擇調用幾個核進行並行運算。
2)parpool; % 這是直接打開並行池的方式。
備注:建議采用第一種,方便關閉和更改參數。
第二步:parfor函數的問題:
1)很多簡單的低緯度運算,建議只需要用普通函數和關鍵字即可,用parfor函數進行運算並不能提升性能。
2)MATLAB利用多核心的計算能力來加速計算時非常有必要的,因為目前所有的電腦最少都雙核心了。
3)循環並行使用parfor循環代替for循環,但是很多時候parfor很不好用,當parfor循環體內的代碼比較多時,非常不容易滿足循環條件而失敗。因此我們首先要分析代碼,另一種方式用profiler打開代碼分析器來分析代碼那一部分耗時較大,進行代碼分析。
3)通用格式:
parfor ss = 1:100
XXX
......
......
end
4)通用並行計算模板:其基本思路就是將循環體內代碼打包為函數!
parfor ss=1:100
func(ss,...,...);
end
函數如下所示:
function func(ss,...,...)
xxx
.....
.....
end
備注:該函數不應該有返回值,當parfor循環體內計算結果需要返回主函數時(絕大多數情況是這樣的),那么將結果在循環體內保存為文件,文件名與循環變量ss有關。當parfor的並行運行完之后,將保存的臨時文件讀取進來即可,保存和讀取計算結果相比於大型的計算耗時來講應該小很多,從而體現出並行的優勢。所提供的該方法可以用於任何一維、二維或者多維循環的加速計算,采用這種方法,規避了學習parofr規則的所有難點,非常具有通用性。
第三步:刪除並行池參數關閉
delete(p)
舉個例子:比如有這么一段並行計算代碼,其中綠色標注的位置為循環體。
p = parpool('local',2);
tic n = 200; A = 500; a = zeros(n); parfor i = 1:n a(i) = max(abs(eig(rand(A)))); end toc
delete(p)
當然這個循環體內可以有不同的計算隊列,我們把這個隊列封裝成為一個函數,如下:
function [a] = sample(A) a = max(abs(eig(rand(A)))); end
然后再用parpool調用,如下:
p = parpool('local',2); clear; tic n = 200; A = 500; a = zeros(n); parfor i = 1:n b = sample(A); a(i) = b; end clear b; toc delete(p);
時間已過 28.838599 秒。
對比原先的代碼:
tic n = 200; A = 500; a = zeros(n); for i = 1:n a(i) = max(abs(eig(rand(A)))); end toc 時間已過 42.570194 秒。
4 MATLAB並行計算的提升有限和MATLAB語言的效率有關,並且和處理的數據量和計算復雜度有關。