姚尚鋒+劉長江+唐正華
DOI:10.16644/j.cnki.cn33-1094/tp.2016.09.021
摘 要: 為了利用分布式和并行計算來解決高性能計算問題,本文介紹了利用MATHWORKS公司開發(fā)的并行計算工具箱在MATLAB中建模與開發(fā)分布式和并行應用的一些方法;包括并行for循環(huán)、批處理作業(yè)、分布式數(shù)組、單程序多數(shù)據(jù)(SPMD)結構等。用這些方法可將串行MATLAB應用程序轉換為并行MATLAB應用程序,且?guī)缀醪恍枰薷拇a和低級語言編寫程序,從而提高了編程和程序運行的效率。用這些方法來執(zhí)行模型,可以解決更大的問題,覆蓋更多的仿真情景并減少桌面資源。
關鍵詞: 建模; 仿真; 并行計算; MATLAB
中圖分類號:TP31 文獻標志碼:A 文章編號:1006-8228(2016)09-73-03
Parallel computing solutions with MATLAB
Yao Shangfeng, Liu Changjiang, Tang Zhenghua, Dai Di
(Simulation Training Center, Armored Force Institute, Bengbu, Anhui 233050, China)
Abstract: For the use of distributed and parallel computing to solve the problem of high-performance computing, this article describes the use of Parallel Computing Toolbox developed by MATHWORKS Company and some methods of parallel applications, including parallel for loop, batch jobs, distributed arrays, Single Program Multiple Data (SPMD) structure. by the methods, the serial MATLAB applications can be converted to parallel MATLAB applications, and almost no need to modify the code and program in low level languages, thereby increasing the efficiency of programming and operation. Use this method to perform model can solve bigger problems, cover more simulation scenarios and reduce the desktop resources.
Key words: modeling; simulation; parallel computing; MATLAB
0 引言
用戶面臨著用更少的時間建立復雜系統(tǒng)模型的需求,他們使用分布式和并行計算來解決高性能計算問題。MATHWORKS公司開發(fā)的并行計算工具箱(Parallel Computing Toolbox)[1-5]可以在MATLAB中建模和開發(fā)分布式和并行應用,并在多核處理器和多核計算機中執(zhí)行,解決計算、數(shù)據(jù)密集型問題[2],而且并不離開即使的開發(fā)環(huán)境;無需更改代碼,即可在計算機集群上運行同一個應用程序(使用MATLAB Distributed Computing Server)。并行的MATLAB應用程序也可以作為可執(zhí)行程序或共享庫(用MATLAB Compiler構建)分發(fā),這些可執(zhí)行程序或共享庫可以訪問MATLAB。
1 并行for循環(huán)
并行for循環(huán)提供了一種在多個MATLAB worker(從客戶會話中單獨運行的MATLAB計算引擎)間分配任務的方式。使用該循環(huán),可以將獨立的循環(huán)迭代自動分配給多個MATLAB worker。例如,100次迭代的循環(huán)可以同時在20個MATLAB worker集群上運行,從而每個worker只執(zhí)行五次迭代循環(huán),整體上提高了循環(huán)的速度。并行for循環(huán)用關鍵字parfor代替關鍵字for。parfor結構管理著MATLAB客戶端與worker之間的數(shù)據(jù)和代碼傳輸。它會自動檢測是否有worker,如果沒有,則還原為串行方式。
下面給出如何將一個簡單的for循環(huán)修改為一個并行的for循環(huán)[1,6]。這一循環(huán)沒有很多的迭代,也不需要很長時間來執(zhí)行,但可以應用相似的方法到更大的循環(huán)。對于這一簡單的例子,我們可能不會注意到執(zhí)行速度的增加,但對于更大的循環(huán),執(zhí)行速度的增加是相當可觀的。
假設用for循環(huán)創(chuàng)建一個正弦波并繪制波形:
for i=1:1024
A(i)=sin(i*2*pi/1024);
end
plot(A)
為了將其修改為并行for循環(huán)代碼,首先按以下方式打開MATLAB池,這樣將保留三個本地worker運行循環(huán)迭代。
matlabpool open local 3
然后,使用parfor修改代碼運行并行for循環(huán):
parfor i=1:1024
A(i)=sin(i*2*pi/1024);
end
plot(A)
此循環(huán)中的惟一差別是關鍵字parfor代替了for。循環(huán)運行后,其結果與for循環(huán)沒有任何區(qū)別。任務完成后,關閉MATLAB池并釋放worker。
matlabpool close
2 批處理作業(yè)
當與MATLAB客戶端交互會話工作時,可以卸載工作到一個運行批處理作業(yè)的MATLAB worker。執(zhí)行此任務的命令是異步的,這意味著客戶端MATLAB進程不會受阻,你能繼續(xù)你的交互式會話,而MATLAB worker負責處理代碼。MATLAB worker可以運行在同一臺機器上,或者如果使用MATLAB分布式計算服務器,也可以運行在遠程集群機器上[4]。
為了卸載工作從MATLAB客戶端到一個worker,可以使用批處理命令。下面的示例使用上面介紹的for循環(huán)。
首先創(chuàng)建和編輯文件名為mywave的文件[6];文件內(nèi)容如下。
for i=1:1024
A(i)=sin(i*2*pi/1024);
end
保存文件并關閉編輯器。然后,在MATLAB命令窗口使用批處理命令在一個單獨的MATLAB worker中運行腳本。
job=batch('mywave')
批處理命令不阻止MATLAB,所以你必須等待作業(yè)完成,然后才能檢索和查看它的結果。
wait(job)
“l(fā)oad”命令將worker工作空間的變量轉移到客戶端工作空間,在這里你可以查看結果。
load(job, 'A')
plot(A)
最后,當作業(yè)完成,刪除其數(shù)據(jù)。
destroy(job)
3 批處理并行循環(huán)
在前面兩個例子中,一個修改了for循環(huán)變?yōu)閜arfor循環(huán),一個提交腳本for循環(huán)作為批處理作業(yè)。下面將它們結合起來創(chuàng)建一個批處理parfor循環(huán)。
首先,在MATLAB編輯器中打開腳本文件mywave并修改腳本,變for循環(huán)為parfor循環(huán)。
parfor i=1:1024
A(i)=sin(i*2*pi/1024);
end
保存文件并關閉編輯器。然后,像前面一樣用批處理命令運行腳本,但需要表明該腳本使用MATLAB池做并行循環(huán)。
job=batch('mywave', 'matlabpool', 3)
此命令指定三名worker(不包括運行批處理腳本的worker)執(zhí)行循環(huán)迭代。因此,本例使用四個本地worker;等待并查看結果。
wait(job)
load(job, 'A')
plot(A)
最后,當作業(yè)完成,刪除其數(shù)據(jù)[4]。
destroy(job)
4 分布式數(shù)組和單程序多數(shù)據(jù)
假如有一個數(shù)組,它相對計算機的內(nèi)存過大,因此它不容易在單一的MATLAB中處理。并行計算工具箱可以將這個數(shù)組分配到多個MATLAB worker中,每個worker只包含數(shù)組的一部分。然而,你可以將整個數(shù)組作為一個單一實體進行操作;每個worker僅操作它所管理的部分,但各worker間在需要時可自動相互傳送數(shù)據(jù),就像使用常用數(shù)組一樣。工具箱提供了150多個用于分布式數(shù)組的重載MATLAB函數(shù);使得我們可以快速的設計開發(fā)并行程序,而不需要去處理低層次的消息傳遞的細節(jié)問題。
分布式數(shù)組的創(chuàng)建有多種方法,可直接使用創(chuàng)建函數(shù)如rand,ones,,zeros創(chuàng)建;下面介紹使用distributed函數(shù)創(chuàng)建分布數(shù)組的方法。
首先,打開MATLAB池。
matlabpool open %用戶默認并行配置
然后,使用distributed函數(shù)創(chuàng)建分布數(shù)組。
M=magic(4) %客戶工作空間中的4×4魔方矩陣
MM=distributed(M);
這里,MM是分布數(shù)組,等同于M;可以象任何其他數(shù)組一樣操縱或訪問它的元素。
M 2=2*MM; %M2也是分布數(shù)組,計算在worker中進行
x=M2(1,1); %客戶端x等于M2的第一個元素
處理完畢后,關閉matlab池。
matlabpool close
單程序多數(shù)據(jù)(SPMD)結構可以定義一個并行運行在MATLAB池中所有l(wèi)abs (workers)上的代碼塊。這里的lab,當MATLAB工作進程開始工作時,它們在默認情況下獨立工作,也可以相互通信協(xié)同工作,這時它們被稱為labs。
matlabpool %使用默認并行配置
SPMD %默認使用池中的所有l(wèi)abs
R=rand(4);
end
此代碼創(chuàng)建一個獨立的4×4隨機矩陣R,其元素存于MATLAB池中所有l(wèi)abs上。
5 結束語
并行計算工具箱延伸了MATLAB交互式環(huán)境,并行命令窗口即能提供熟悉的MATLAB環(huán)境原型用于開發(fā)分布式和并行應用程序,也能提供在批處理環(huán)境中脫機執(zhí)行分布式和并行應用程序。無需為特定的硬件和網(wǎng)絡架構編寫程序,就可方便的將串行MATLAB應用程序轉換為并行MATLAB應用程序,從而能夠以較高的級別在MATLAB中執(zhí)行任務及數(shù)據(jù)并行算法。用這種方法來執(zhí)行模型,可以解決更大的問題,覆蓋更多的仿真情景并減少桌面資源。
參考文獻(References):
[1] 劉維編著.實戰(zhàn)Matlab之并行程序設計[M].北京航空航天大
學出版社,2012.
[2] 高山流水.Matlab并行計算工具箱及MDCE介紹[M/OL].
http://blog.sina.com.cn/s/blog_45eac6860100lzlk.html.
[3] 吳鵬編著.Matlab高效編程技巧與應用[M]. 北京航空航天大
學出版社,2010.
[4] 靖穩(wěn)峰.Matlab并行程序設計[M/OL].http://wenku.baidu.com/
link?url=yKuBHklFu3oxBDDUl6BXr4xzRhbepRJlhJoWwUlbr_
FMvRNR3VDhnw-AvC9wJvSmuMVC3TAH3A5ncOO3Ep
WVX7HuBObM9ubhWzlr4KXVRpK
[5] 彭代慧,鄒顯春編著.Matlab2013實用教程[M].高等教育出
版社,2014.
[6] 飛思科技產(chǎn)品研發(fā)中心編著.Matlab7基礎與提高[M].電子
工業(yè)出版社,2006.