MATLAB并行计算解决方案

计算机时代 / 2018年02月22日 19:52

新闻

姚尚锋+刘长江+唐正华

DOI:10.16644/j.cnki.cn33-1094/tp.2016.09.021

摘 要: 为了利用分布式和并行计算来解决高性能计算问题,本文介绍了利用MATHWORKS公司开发的并行计算工具箱在MATLAB中建模与开发分布式和并行应用的一些方法;包括并行for循环、批处理作业、分布式数组、单程序多数据(SPMD)结构等。用这些方法可将串行MATLAB应用程序转换为并行MATLAB应用程序,且几乎不需要修改代码和低级语言编写程序,从而提高了编程和程序运行的效率。用这些方法来执行模型,可以解决更大的问题,覆盖更多的仿真情景并减少桌面资源。

关键词: 建模; 仿真; 并行计算; 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 引言

用户面临着用更少的时间建立复杂系统模型的需求,他们使用分布式和并行计算来解决高性能计算问题。MATHWORKS公司开发的并行计算工具箱(Parallel Computing Toolbox)[1-5]可以在MATLAB中建模和开发分布式和并行应用,并在多核处理器和多核计算机中执行,解决计算、数据密集型问题[2],而且并不离开即使的开发环境;无需更改代码,即可在计算机集群上运行同一个应用程序(使用MATLAB Distributed Computing Server)。并行的MATLAB应用程序也可以作为可执行程序或共享库(用MATLAB Compiler构建)分发,这些可执行程序或共享库可以访问MATLAB。

1 并行for循环

并行for循环提供了一种在多个MATLAB worker(从客户会话中单独运行的MATLAB计算引擎)间分配任务的方式。使用该循环,可以将独立的循环迭代自动分配给多个MATLAB worker。例如,100次迭代的循环可以同时在20个MATLAB worker集群上运行,从而每个worker只执行五次迭代循环,整体上提高了循环的速度。并行for循环用关键字parfor代替关键字for。parfor结构管理着MATLAB客户端与worker之间的数据和代码传输。它会自动检测是否有worker,如果没有,则还原为串行方式。

下面给出如何将一个简单的for循环修改为一个并行的for循环[1,6]。这一循环没有很多的迭代,也不需要很长时间来执行,但可以应用相似的方法到更大的循环。对于这一简单的例子,我们可能不会注意到执行速度的增加,但对于更大的循环,执行速度的增加是相当可观的。

假设用for循环创建一个正弦波并绘制波形:

for i=1:1024

A(i)=sin(i*2*pi/1024);

end

plot(A)

为了将其修改为并行for循环代码,首先按以下方式打开MATLAB池,这样将保留三个本地worker运行循环迭代。

matlabpool open local 3

然后,使用parfor修改代码运行并行for循环:

parfor i=1:1024

A(i)=sin(i*2*pi/1024);

end

plot(A)

此循环中的惟一差别是关键字parfor代替了for。循环运行后,其结果与for循环没有任何区别。任务完成后,关闭MATLAB池并释放worker。

matlabpool close

2 批处理作业

当与MATLAB客户端交互会话工作时,可以卸载工作到一个运行批处理作业的MATLAB worker。执行此任务的命令是异步的,这意味着客户端MATLAB进程不会受阻,你能继续你的交互式会话,而MATLAB worker负责处理代码。MATLAB worker可以运行在同一台机器上,或者如果使用MATLAB分布式计算服务器,也可以运行在远程集群机器上[4]。

为了卸载工作从MATLAB客户端到一个worker,可以使用批处理命令。下面的示例使用上面介绍的for循环。

首先创建和编辑文件名为mywave的文件[6];文件内容如下。

for i=1:1024

A(i)=sin(i*2*pi/1024);

end

保存文件并关闭编辑器。然后,在MATLAB命令窗口使用批处理命令在一个单独的MATLAB worker中运行脚本。

job=batch('mywave')

批处理命令不阻止MATLAB,所以你必须等待作业完成,然后才能检索和查看它的结果。

wait(job)

“load”命令将worker工作空间的变量转移到客户端工作空间,在这里你可以查看结果。

load(job, 'A')

plot(A)

最后,当作业完成,删除其数据。

destroy(job)

3 批处理并行循环

在前面两个例子中,一个修改了for循环变为parfor循环,一个提交脚本for循环作为批处理作业。下面将它们结合起来创建一个批处理parfor循环。

首先,在MATLAB编辑器中打开脚本文件mywave并修改脚本,变for循环为parfor循环。

parfor i=1:1024

A(i)=sin(i*2*pi/1024);

end

保存文件并关闭编辑器。然后,像前面一样用批处理命令运行脚本,但需要表明该脚本使用MATLAB池做并行循环。

job=batch('mywave', 'matlabpool', 3)

此命令指定三名worker(不包括运行批处理脚本的worker)执行循环迭代。因此,本例使用四个本地worker;等待并查看结果。

wait(job)

load(job, 'A')

plot(A)

最后,当作业完成,删除其数据[4]。

destroy(job)

4 分布式数组和单程序多数据

假如有一个数组,它相对计算机的内存过大,因此它不容易在单一的MATLAB中处理。并行计算工具箱可以将这个数组分配到多个MATLAB worker中,每个worker只包含数组的一部分。然而,你可以将整个数组作为一个单一实体进行操作;每个worker仅操作它所管理的部分,但各worker间在需要时可自动相互传送数据,就像使用常用数组一样。工具箱提供了150多个用于分布式数组的重载MATLAB函数;使得我们可以快速的设计开发并行程序,而不需要去处理低层次的消息传递的细节问题。

分布式数组的创建有多种方法,可直接使用创建函数如rand,ones,,zeros创建;下面介绍使用distributed函数创建分布数组的方法。

首先,打开MATLAB池。

matlabpool open %用户默认并行配置

然后,使用distributed函数创建分布数组。

M=magic(4) %客户工作空间中的4×4魔方矩阵

MM=distributed(M);

这里,MM是分布数组,等同于M;可以象任何其他数组一样操纵或访问它的元素。

M 2=2*MM; %M2也是分布数组,计算在worker中进行

x=M2(1,1); %客户端x等于M2的第一个元素

处理完毕后,关闭matlab池。

matlabpool close

单程序多数据(SPMD)结构可以定义一个并行运行在MATLAB池中所有labs (workers)上的代码块。这里的lab,当MATLAB工作进程开始工作时,它们在默认情况下独立工作,也可以相互通信协同工作,这时它们被称为labs。

matlabpool %使用默认并行配置

SPMD %默认使用池中的所有labs

R=rand(4);

end

此代码创建一个独立的4×4随机矩阵R,其元素存于MATLAB池中所有labs上。

5 结束语

并行计算工具箱延伸了MATLAB交互式环境,并行命令窗口即能提供熟悉的MATLAB环境原型用于开发分布式和并行应用程序,也能提供在批处理环境中脱机执行分布式和并行应用程序。无需为特定的硬件和网络架构编写程序,就可方便的将串行MATLAB应用程序转换为并行MATLAB应用程序,从而能够以较高的级别在MATLAB中执行任务及数据并行算法。用这种方法来执行模型,可以解决更大的问题,覆盖更多的仿真情景并减少桌面资源。

参考文献(References):

[1] 刘维编著.实战Matlab之并行程序设计[M].北京航空航天大

学出版社,2012.

[2] 高山流水.Matlab并行计算工具箱及MDCE介绍[M/OL].

http://blog.sina.com.cn/s/blog_45eac6860100lzlk.html.

[3] 吴鹏编著.Matlab高效编程技巧与应用[M]. 北京航空航天大

学出版社,2010.

[4] 靖稳峰.Matlab并行程序设计[M/OL].http://wenku.baidu.com/

link?url=yKuBHklFu3oxBDDUl6BXr4xzRhbepRJlhJoWwUlbr_

FMvRNR3VDhnw-AvC9wJvSmuMVC3TAH3A5ncOO3Ep

WVX7HuBObM9ubhWzlr4KXVRpK

[5] 彭代慧,邹显春编著.Matlab2013实用教程[M].高等教育出

版社,2014.

[6] 飞思科技产品研发中心编著.Matlab7基础与提高[M].电子

工业出版社,2006.

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。