Matlab并行编程方法
本文講一下matlab中的并行方法與技巧,這里我們不涉及GPU加速,主要考慮for循環并行和數據并行。分為以下幾個板塊:
1. 怎么并行?
2. parfor vs. SPMD
3. 注意事項及經驗總結
 
 
 
 
 -----------------------------------------------------------
 
1. 如何并行?
 1. Request a number of workers;
 2. Issue the normal command to run the program. The client program will call on the?workers as needed;
 3. Release the workers;
具體到代碼:
[plain]?view plain?copy ?
其中2是core數目,注意2是core數。你的電腦如果是雙核四線程的,那么只能申兩個(而非4個)matlab local pool。
具體實現parallel program呢,主要是通過parfor(parallel for)和SPMD(single program, multiple data)完成的。
 
 
 
 
 
 
-----------------------------------------------------------
2. parfor vs. SPMD
2.1 什么時候用parfor
parfor只用于matlab并行循環。當你需要簡單計算的多次循環迭代時,例如蒙特卡洛(Monte Carlo)模擬,parfor循環就很有用。parfor將循環迭代分組,那么每個worker執行迭代的一部分。當迭代耗時很長的時候parfor循環也是有用的,因為workers可以同時執行迭代。
注意當循環中有迭代依賴其他迭代的結果時不應該使用parfor循環。每個迭代都必須不依賴其他迭代。由于parfor循環內有通信消耗,當只有小數量的簡單計算時使用parfor可能得不到什么好處。
[plain]?view plain?copy ?
2.2 什么時候用SPMD(Single Program/Multiple Data)單程序多任務進行任務并行
 Spmd中的“Single program”方面指的是同一段代碼運行在不同的多個lab上。你在一個Matlab客戶端上運行一個程序,被標志為spmd模塊的其他部分運行在其他lab上。當這些塊運行完畢后,你的程序繼續在客戶端運行。?“Multiple data”方面指的是雖然spmd語句在所有的lab上運行相同的代碼,但每一個lab可以有不同的,獨有的數據。所以多數據集可以在多個lab上同時被容納。一下是我總結的SPMD使用的兩個場景:
 
 
 
 The "single program" aspect of spmd means that the identical code runs on multiple labs. 就是說同一段程序應用于不同的樣本(數據),所以一般針對隨機抽樣的并行,如
 
另外,SPMD也可以用于可替代parfor的塊并行,在不同lab(worker)上對相同或不同的數據執行不同的并行操作,說起來有些拗口,具體看一下例子就明白了,下面我寫的example3,4分別針對在不同lab上對相同數據和不同數據執行不同操作。它們都可以用parfor代替,對吧,這里我就不寫了,相信大家的能力。。
[plain]?view plain?copy ?
以上是我對spmd和parfor的理解,歡迎補充指正,其他關于spmd vs. parfor的可以參考這個帖子。
 
 
2.3 Composite類型
spmd中每個lab返回值以composite存儲,如上面[code]example 1中的f就是以composite的形式展現。f{i}為第i個lab的返回值。最開始我們也可以創建Composite對象并進行初始化賦值。
>>??f = Composite(2);
 
 
 
 
 -----------------------------------------------------------
 
4. 注意事項及經驗總結
注意事項:
1. parfor中慎用(最好勿用)eval幅值。
一個程序并行時要共享內存,而eval語句可能使程序進入錯誤的workspace,因此不要用eval,改用不同index賦值。
[plain]?view plain?copy ?
 
 
2. parfor循環不能很好利用所有處理器怎么辦?
是這樣,
[python]?view plain?copy ?
就只能用4個處理器,而如果不加這個parfor可能matlab自身的負載均衡能夠更好地利用CPU。這里我是開起來3個matlab,比如服務器上有12個核。我就給每個matlab分配4個core(>>matlabpool local 4),每個程序里有一個parfor i = 1:4. 這樣就可以用起來12個核。我知道這樣好暴力……囧,有人知道正解的話指條明路吧。。
 
 
3. parfor,spmd不可以相互或者自身嵌套。
 
 
4. parfor使用有很多約束,比如for循環內的表達式需要顯式表達(透明性),不依賴前項。如
parfor i = 3:10
? ? ? ?f(i) = f(i-1)+f(i-2);
end
是不行滴。。
 
 
歡迎留言其他并行技巧和方法,謝謝!
 
 
 
 
Reference:
1. MATLAB官網——Parallel Computing Toolbox
2.?詳細講解并行用法(貌似阿拉伯人寫的……o(╯□╰)o)
3. 詳細并行代碼
4.?多核計算平臺中MATLAB并行計算
5. Parallel Computing Toolbox?User's Guide
 
 
from:?http://blog.csdn.net/abcjennifer/article/details/17610705#comments
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Matlab并行编程方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MFC+OPENCV实现角点检测
- 下一篇: OpenGL 基础图形绘制与投影变换
