高性能计算
同上 关闭Matlab并行计算池
matlabpool size
返回当前打开的并行计算池的worker数目
1.4 能够直接用parfor关键字改写 的几类类串行for代码
各次循环对应的循环体操作相互独立的串行代码:
for代码 for i=1:20
a(i)=i b(i)=2*a(i) end
parfor代码 smp %启动并行计算 池 parfor i=1:20
j
2r0r
r0 r
2.2 程序分析与设计 z 接收屏
r
n
2
方孔
y
1
r0
x
S
屏上任意一点的光场决定于方孔上所有点光场的叠加,所以要计算出屏 上的一点的光场分布,就要遍历方孔上的所有点。遍历方孔上的所有点 需要一个两重循环,而要计算出屏上所有接收点的光场分布,也需要一 个两重循环,所以完成这个计算就要是一个四重循环。这样的计算的数 据量是相当大的,如单单只用for循环进行计算就需要花费大量的时间。
2.1 数学模型
z
接收屏
r
n
2
方孔
y
1
r0
x
S
屏上任意一点的光场公式:
E(P) 1 A exp( jkr0 ) exp( jkr) (cos1 cos2 )ds
j
r0
r
2
z
接收屏
r
n
2
方孔
y
1
r0
x
S
为了便于编程计算,将上式改写成:
E(P) 1 Aexp[ jk(r0 r)][n ( r0 r )]ds
示:
for i=ib1:ie1 计算模块
end
处理单元 1
for i=ib:ie 计算模块
end
for i=ib2:ie2 计算模块
end
……
处n:ien 计算模块
end
处理单元 n
默认的情况下,Matlab启动时只有一个进程,因此默 认的情况下Matlab执行parfor关键字标识的循环是串 行的。Matlab并行执行parfor循环之前需要打开 Matllab并行计算池。 Matlab并行计算池打开后,其 中包含若干可以运行Matlab并行程序的Matlab进程 (即worker),通过多个Matlab worker并行执行 parfor循环。
parfor关键字并行执行for循环时,会将for循环划分为若干部
分,每个部分交友不同的worker执行。假设worker数量为m,
循环次数为n,则n/m如果能整除的话,则循环将会被均匀划
分;如果不能整除的话,循环会被非均匀的划分,其中某些
worker会执行较多的循环次数。其执行的基本步骤如下图所
a(i)=i b(i)=2*a(i) end
从上面的代码,可以看出直接将for替换成parfor,就可 将并行循环变为并行循环。
循环体内并不独立,但循环执行的结果与执行的 顺序无关。此类操作被成为简约操作
for i=1:30 a=a+i;
end
上述代码执行后,for循环体依次执行,单次循环操 作依赖上次执行的结果,但循环的求和的结果与求 和的顺序无关。Matlab对简约操作进行了处理,准 许采用parfor关键字对简约操作对应的for循环进行 并行执行,parfor循环执行的结果与for相同。
2 方孔衍射图案计算程序设计
2.1 数学模型 2.2 程序分析与设计 2.3 总结
1.1 循环
循环分为两种:一种是固定次数的循环,另一种是 非固定次数的循环。在Matlab程序中,提高循环的 计算效率往往是提高程序设计效率的关键。
Matlab程序中,循环结构的一般形式如下:
for i=i_begin : i_step : i_end 计算模块
Matlab并行计算之parfor介绍 及其在小孔衍射计算上的应用
内容提要
1 利用parfor对for循环进行并行介绍
1.1 循环 1.2 利用parfor并行for循环的基本原理 1.3 配置Matlab并行计算池 1.4 能够直接用parfor关键字改写的几类类串行for代码
Matlab并行执行parfor循环是采用client和worker模式。其 中client指编写和启动并行代码的Matlab端,worker是指 并行运行代码的Matlab端。
用户首先在client端编写并行代码,然后运行并行代码。 Client端在运行Matlab代码的过程中,如果发现摸个代码 需要并行执行,Matlab client端根据并行代码的关键字及 类型将并行代码分配到本机或网络上的其他Matlab进程执 行,那些最终执行并行代码的Matlab进程即为worker。
end
其中i为循环变量,i_begin、i_step 和i_end分别为循环变 量的起始值、步长和终止界。
1.2 利用parfor并行for循环的基本原理
由for关键字表示的循环可以通过parfor关键字进行并行。 parfor关键字主要是针对循环进行并行,其将循环分解为 独立的部分,然后将各个部分并行执行,提高程序的执行 效率。
clear,smp a(1:10,1:10)=0; parfor i=1:10
for j=1:10 for m=1:10 for n=1:10 a(m,n)=a(m,n)+1; end end
end end a
报错的信息如下:
Error using Untitled111 (line 3) Error: The variable a in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".
采用指定配置项打开并行计算池,指定配置项名称为 matlabpool open configname
configname
matlabpool open configname 采用指定配置项打开并行计算池,指定配置项名称为
poolsize
configname。打开的worker数为poolsize
matlabpool configname_name size matlabpool close
681.286710 s 49.663763 s 37.674767 s
2.3 总结
Matlab中for循环的运算效率要远远比矩阵运算的低, 因此在数据就算量较大的情况下,可以考虑将循环 运算矩阵化。用parfor关键字进行并行计算,在循环 次数较多的情况下,可以提高计算效率,但由于并 行计算是Matlab新推出的功能,还有很多不完善的 地方,因此在编程的时候,可以编写一个简单的并 行程序进行的简单验证,也可以以此来查找程序出 错原因。
1.3 配置Matlab并行计算池
命令 matlabpool
使用方法 打开并行计算池,采用默认配置项,默认为‘local’
matlabpool open
打开并行计算池,采用默认配置项,默认为‘local’
matlabpool open poolsize
打开worker数目为poolsize个的并行计算池,poolsize 的必须小于配置指定的worker数
Matlab并行计算池管理若干个worker,每个worker都 可执行分配的并行计算任务,其对应的物理单元即处 理器或处理器核。对于某个处理单元,如果其上运行 一个worker,则此处的处理单位便可被用于执行循环 的某一部分。只有启动了并行计算池,parfor关键字 在执行的时候,才能达到并行执行循环的目的。
由于屏上每点的光场是方孔上所有点光场的 线性叠加,这与叠加的顺序无关,因此可以 分别计算方孔上的点对屏上光场的贡献,之 后再将结果相加就可以得到屏上光场的分布。 据此,对应与parfor简约操作原理,可以将原 先的串行程序改写为并行的程序,以加快计 算速度,提高计算的效率。
运行结果
运行时间:
for循环代码(一) for循环代码(二) parfor改编代码