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;
具體到程式碼:
matlabpool local 2;
%parallel program
matlabpool close
其中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可能得不到什麼好處。
c = 1:10;
a = ones(10,1);
tic
parfor i = 1:length(c)
a(i)= a(i)+ c(i);
end
toc
fprintf('%d\n',a);
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
%example 1
spmd
A = rand(3,2); %generate a matrix A for each lab(worker)
end
for i = 1:length(A)
figure; imagesc(A{i});
end
%example 2
a = 3;
b = 4;
spmd
c = labindex();
d = c+a;
end
c{2} = 5;
spmd
f = c*b;
end
for i = 1:length(f)
fprintf('%d\t',f{i});%access the value of each lab
end
另外,SPMD也可以用於可替代parfor的塊並行,在不同lab(worker)上對相同或不同的資料執行不同的並行操作,說起來有些拗口,具體看一下例子就明白了,下面我寫的example3,4分別針對在不同lab上對相同資料和不同資料執行不同操作。它們都可以用parfor代替,對吧,這裡我就不寫了,相信大家的能力。。
%example3 - deal with same Data by different parameters
%add different values to same array Data
Data = 1:100;
spmd
switch labindex
case 1
Data = Data+1;
case 2
Data = Data+2;
end
end
% print Data{1} & Data{2} for checking
%example4
%add different values for different parts of array Data
% [1:50]+1
% [51:100]+2
spmd
if labindex == 1
Data(1:50) = Data(1:50)+1;
else
Data(51:100) = Data(51:100)+2;
end
end
以上是我對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賦值。
matlabpool local 2;
c = 1:5;
parfor i = 1:length(c)
a(i) = c(i);
end
2. parfor迴圈不能很好利用所有處理器怎麼辦?
是這樣,
parfor i = 1:4
........
end
就只能用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. 詳細並行程式碼
5. Parallel Computing Toolbox User's Guide
歡迎關注本部落格和新浪微博Rachel____Zhang
相關文章
- (Python程式設計 | 系統程式設計 | 並行系統工具 | 程式退出)Python程式設計並行
- .NET併發程式設計-資料並行程式設計並行
- 並行程式設計並行行程程式設計
- 併發程式設計-8.並行資料結構和並行Linq程式設計並行資料結構
- GPU程式設計(四):並行規約優化GPU程式設計並行優化
- Matlab AppDesigner程式設計教程第1章——物件導向程式設計MatlabAPP程式設計物件
- MATLAB程式設計與應用系列-關於MATLAB程式設計入門教程的總體編寫安排Matlab程式設計
- Python並行程式設計Python並行行程程式設計
- Python 並不合適職場程式設計,SPL 才行Python程式設計
- .NET併發程式設計-任務函式並行程式設計函式並行
- C#並行,多執行緒程式設計並行集合和PLINQ的例項講解並行執行緒程式設計
- Matlab學習-視覺化和程式設計Matlab視覺化程式設計
- 併發程式設計-6.並行程式設計概念程式設計並行行程
- .NET併發程式設計-TPL Dataflow並行工作流程式設計並行
- C#並行Parallel程式設計模型實戰技巧手冊C#並行Parallel程式設計模型
- 深入C#並行程式設計(1) -- 瞭解執行緒C#並行行程程式設計執行緒
- 五種Java程式設計高效程式設計方法 - BablaJava程式設計
- iOS程式設計師如何成為程式設計高手,並以此創業iOS程式設計師創業
- matlab: 檢查程式執行效率Matlab
- Matlab程式設計之——卷積神經網路CNN程式碼解析Matlab程式設計卷積神經網路CNN
- 何時停止設計並啟動實施程式設計? - Alter程式設計
- 遊戲架構設計——高效能並行程式設計遊戲架構並行行程程式設計
- MATLAB R2023a 數學計算和程式設計軟體 mac版Matlab程式設計Mac
- Golang語言並行設計的核心goroutineGolang並行
- 程式設計師程式設計時的簡單方法與技巧程式設計師
- Java中的函數語言程式設計(八)流Stream並行程式設計Java函數程式設計並行行程
- 碼農很多,但程式設計師並不多......程式設計師
- 程式設計師的美麗假期(並不)程式設計師
- Python 並不適合職場程式設計Python程式設計
- C#並行程式設計:Parallel的使用C#並行行程程式設計Parallel
- Matlab圖形使用者介面程式設計初級入門Matlab程式設計
- 併發程式設計-7.任務並行庫(TPL)和資料流程式設計並行
- C#多執行緒(四)並行程式設計篇之結構化C#執行緒並行行程程式設計
- Java多執行緒程式設計筆記2:synchronized同步方法Java執行緒程式設計筆記synchronized
- 基於jupyter lab搭建網頁程式設計環境並新增自定義python kernel和matlab kernel以及plotly的使用網頁程式設計PythonMatlab
- MATLAB R2022a for Mac(專業程式設計和數學計算軟體)MatlabMac程式設計
- Mac專業程式設計和數學計算軟體:MATLAB R2022aMac程式設計Matlab
- Java並行流:一次搞定多執行緒程式設計難題,讓你的程式飛起來!Java並行執行緒程式設計
- java設計學生類並進行測試Java