Matlab高級教程_第二篇:Matlab相見恨晚的模塊_02_並行運算-關於parfor的問題


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語言的效率有關,並且和處理的數據量和計算復雜度有關。

 


免責聲明!

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



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