Matlab的parfor並行編程

Matlab的parfor並行編程

  • 一般消耗最多計算資源的程序每每是循環。

    把循環並行化。或者優化循環體中的代碼是最常常使用的加快程序執行速度的思路。編程

  • Matlab提供了parforkeyword,可以很是方便的在多核機器或集羣上實現並行計算。

parforkeyword的使用

  • 由forkeyword引導的循環一般爲串行運行。假設改成parfor則可以由多個worker以並行方式運行。
  • parfor可以將n次循環分解爲獨立不相關的m部分,而後將各部分分別交給一個worker運行。
  • 循環運行的結果應該與n次循環運行的順序無關。

parfor中的變量類型

簡約變量

  • 通常parfor中各次循環相應的運算應該相互獨立,但簡約操做可以在屢次循環內同一時候對一個變量操做。這樣的變量稱爲簡約變量。

    比例如如下方代碼中a就是簡約變量。 性能

    a = 0;
    for i = 1:1000
      a = a+i;
    end
  • 簡約操做包含+ - * .* & | [,] [;] {,} {;} min max union intersect
  • 同一個parfor循環對簡約變量的操做必須一致。即必須是同一種簡約操做符。而且與操做符的相對位置也必須一致。

  • 簡約變量賦值表達式應該知足結合律和交換律。

    * [] {}底層有特殊處理保證結果的正確性。優化

切片變量

  • parfor中可能需要讀取或寫入parfor以外的矩陣,讀取寫入位置與循環變量相關。這樣就需要向worker傳輸大量的數據。

  • 矩陣假設被Matlab識別爲切片變量,則數據可以分段傳輸到各worker,提升傳輸效率。

  • 切片變量矩陣的大小是不可在parfor中改變的。且爲了保證Matlab識別正確。每次循環中僅僅能讀取由同一個索引值索引的切片。如a[i] a[i+1]同一時候出現則a不被識別爲切片變量。

循環變量

  • 如上例中的i,表示當前循環的id。

廣播變量

  • 在parfor以前賦值,在parfor內僅僅進行讀取操做。

暫時變量

  • 做用域侷限於parfor內。parfor結束後不存在。

    不影響parfor以前聲明的同名變量。spa

各類變量區分的樣例

  • 下例中,parfor中的tmp是暫時變量,parfor結束後tmp的值依舊是5,不受暫時變量的影響。
  • broadcast是廣播變量。每次循環中的值不變。
  • redued是簡約變量。Matlab對其的值將分段由各worker計算後送回主進程處理。
  • sliced爲切片變量。傳輸數據有優化提高。
  • i爲循環變量。

    tmp = 5;
    broadcast = 1;
    reduced = 0;
    sliced = ones(1, 10);
    parfor i = 1:10
      tmp = i;
      reduced = reduced + i + broadcast;
      sliced(i) = sliced(i) * i;
    end

worker配置

  • 在執行程序以前。需要配置worker。不然如前文所說,parfor循環將以普通for循環的形式執行,沒法並行。

單機配置

  • 使用matlabpool命令可以開啓關閉本機的並行計算池。
  • matlabpool n命令可以打開n個worker。
  • matlabpool open configname依照指定配置打開,默認配置爲local

  • 程序執行結束後,應該使用matlabpool close關閉worker。
  • 配置項的改動可以經過Parallel -> Manage Cluster Profile完畢。

  • n的選擇:假設有c個cpu核心,一般可以設置爲c。假設是遠程server,爲防止server響應卡頓,可以設置爲c-1

    對於計算密集型程序,超線程帶來的性能提高差點兒爲0,可以設置爲核心數,而不是線程數。.net

注意事項

  • 循環次數n最好能整除以worker個數m,不然部分worker會分配較多的循環,形成一部分worker閒置一段時間,減小了並行性。
  • 並行執行時各個worker之間會進行通訊。要注意大量傳輸數據帶來的性能降低。

    尤爲對於廣播變量。假設較大可嘗試變爲切片變量。線程

  
  

轉載請註明做者:Focustc,博客地址爲 http://blog.csdn.net/caozhk。原文連接爲 點我
相關文章
相關標籤/搜索