高性能计算
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
同上 关闭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
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
Matlab并行计算之parfor介绍 及其在小孔衍射计算上的应用
内容提要
1 利用parfor对for循环进行并行介绍
1.1 循环 1.2 利用parfor并行for循环的基本原理 1.3 配置Matlab并行计算池 1.4 能够直接用parfor关键字改写的几类类串行for代码
end
其中i为循环变量,i_begin、i_step 和i_end分别为循环变 量的起始值、步长和终止界。
1.2 利用parfor并行for循环的基本原理
由for关键字表示的循环可以通过parfor关键字进行并行。 parfor关键字主要是针对循环进行并行,其将循环分解为 独立的部分,然后将各个部分并行执行,提高程序的执行 效率。
示:
for i=ib1:ie1 计算模块
end
处理单元 1
for i=ib:ie 计算模块
end
for i=ib2:ie2 计算模块
end
……
处理单元 2 ……
汇总结果
for i=ibn: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会执行较多的循环次数。其执行的基本步骤如下图所
采用指定配置项打开并行计算池,指定配置项名称为 matlabpool open configname
configname
matlabpool open configname 采用指定配置项打开并行计算池,指定配置项名称为
poolsize
configname。打开的worker数为poolsize
matlabpool configname_name size matlabpool close
1.3 配置Matlab并行计算池
命令 matlabpool
使用方法 打开并行计算池,采用默认配置项,默认为‘local’
matlabpool open
打开并行计算池,采用默认配置项,默认为‘local’
matlabpool open poolsize
打开worker数目为poolsize个的并行计算池,poolsize 的必须小于配置指定的worker数
j
2r0r
r0 r
2.2 程wk.baidu.com分析与设计 z 接收屏
r
n
2
方孔
y
1
r0
x
S
屏上任意一点的光场决定于方孔上所有点光场的叠加,所以要计算出屏 上的一点的光场分布,就要遍历方孔上的所有点。遍历方孔上的所有点 需要一个两重循环,而要计算出屏上所有接收点的光场分布,也需要一 个两重循环,所以完成这个计算就要是一个四重循环。这样的计算的数 据量是相当大的,如单单只用for循环进行计算就需要花费大量的时间。
Matlab并行执行parfor循环是采用client和worker模式。其 中client指编写和启动并行代码的Matlab端,worker是指 并行运行代码的Matlab端。
用户首先在client端编写并行代码,然后运行并行代码。 Client端在运行Matlab代码的过程中,如果发现摸个代码 需要并行执行,Matlab client端根据并行代码的关键字及 类型将并行代码分配到本机或网络上的其他Matlab进程执 行,那些最终执行并行代码的Matlab进程即为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相同。
Matlab并行计算池管理若干个worker,每个worker都 可执行分配的并行计算任务,其对应的物理单元即处 理器或处理器核。对于某个处理单元,如果其上运行 一个worker,则此处的处理单位便可被用于执行循环 的某一部分。只有启动了并行计算池,parfor关键字 在执行的时候,才能达到并行执行循环的目的。
2 方孔衍射图案计算程序设计
2.1 数学模型 2.2 程序分析与设计 2.3 总结
1.1 循环
循环分为两种:一种是固定次数的循环,另一种是 非固定次数的循环。在Matlab程序中,提高循环的 计算效率往往是提高程序设计效率的关键。
Matlab程序中,循环结构的一般形式如下:
for i=i_begin : i_step : i_end 计算模块
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".
681.286710 s 49.663763 s 37.674767 s
2.3 总结
Matlab中for循环的运算效率要远远比矩阵运算的低, 因此在数据就算量较大的情况下,可以考虑将循环 运算矩阵化。用parfor关键字进行并行计算,在循环 次数较多的情况下,可以提高计算效率,但由于并 行计算是Matlab新推出的功能,还有很多不完善的 地方,因此在编程的时候,可以编写一个简单的并 行程序进行的简单验证,也可以以此来查找程序出 错原因。
由于屏上每点的光场是方孔上所有点光场的 线性叠加,这与叠加的顺序无关,因此可以 分别计算方孔上的点对屏上光场的贡献,之 后再将结果相加就可以得到屏上光场的分布。 据此,对应与parfor简约操作原理,可以将原 先的串行程序改写为并行的程序,以加快计 算速度,提高计算的效率。
运行结果
运行时间:
for循环代码(一) for循环代码(二) parfor改编代码