. end
for i = drange(range) loop body
. . End Parallel loop for implicit
distribution of work
Not Implemented parfor i = range loop body
Spmd 中的“Single program”方面指的是同一段代码运行在不同的多个 lab 上。你在一 个 Matlab 客户端上运行一个程序,被标志为 spmd 模块的其他部分运行在其他 lab 上。当这 些块运行完毕后,你的程序继续在客户端运行。
“Multiple data”方面指的是虽然 spmd 语句在所有的 lab 上运行相同的代码,但每一个 lab 可以有不同的,独有的数据。所以多数据集可以在多个 lab 上同时被容纳。
Spmd 使用的典型场景是需要在多个数据集上同时执行一个程序,在不同的 lab 间需要
交互和同步。一些常见的场景如下:
程序花费很长的时间来执行 - spmd 让几个 lab 同时计算结果。
程序运行在大型数据集上 - spmd 让这些数据分布在多个 lab 上。
3.1.3 使用 matlabpool 创建 matlab 资源
你使用 matlabpool 函数存储一定数量的 MATLAB lab(workers)来执行一个后来的 spmd 语句或者 parfor 循环。依赖于你的调度程序,labs 可能远程运行于一个机组上,或者他们可 能运行于本地 Matlab 客户端。你通过选择并发配置来确定一个调度程序和机组。对于怎样 管理和使用配置的描述,可以看 Programming with User Configurations.
开始这一节的例子,为你的 spmd 语句的赋值分配当地 Matlab labs.
matlabpool
这个命令打开了一定数量的的 Matlab 工作者会话,这个数量是由缺省并行配置决定的。
如果本地配置是你的缺省值,并且没有制定工作者的数量,在你本地的 Matlab 客户端机器 上将在每一个 core(最大 8 个)上开始一个工作者。
如果你不想使用缺省值,你可以在 matlab 语句中制定配置或者 labs 怎样使用。举个例 子,你的缺省配置只是使用 3 个 labs,键入:
Matlabpool 3
为了使用不同的配置 ,键入:
Matlabpool MyconfigName
为了查询你现在是否有一个 Matlabpool 是打开的,键入:
Matlabpool size
这个命令返回一个值指明当前的池中 lab 的数量。如果命令返回 0,表明现在没有池是 打开的。
注意:你的已经安装了并行计算工具包软件,如果没有池打开,spmd 语句在本地 Matlab 客户端运将行没有任何的并行执行。换句话说,它运行在你的客户会话里就像它是一个单独 的 lab。
当你使用一个 MATLAB 池完毕,使用这个命令关闭它:
matlabpool close
3.1.4 定义一个 spmd 语句
Spmd 语句的一般形式是:
Spmd
<statements>
End
在<statements>中描述的代码块会在 matlabpool 中在所有的 lab 上同时并行的执行。你 想限制执行只使用这些 lab 中的一部分,准确的指定运行多少个 lab 即可:
Spmd(n)
<statements>
End
语句要求 n 个 lab 运行 spmd 代码,n 必须小于等于在打开 Matlab 池中 lab 的数量。如 果池足够大,但是 n 个 lab 并不可用,语句将等待直到 lab 可用。如果 n 为 0,spmd 语句没 有使用 lab,只是在本地客户端运行,就像当时没有池是开着的。
你可以指定 lab 数量的范围
Spmd(m,n)
<statesments>
End
在这种情况下,spmd 语句需要最小为 m 个 lab,它使用最大为 n 个 lab。
如果控制执行 spmd 语句的 lab 数量是重要的,需要在你的配置中或者在 spmd 语句中 准确的设置这个数字,而不仅仅是使用范围。
据个例子,在 3 个 lab 上创建一个随机矩阵:
matlabpool spmd(3)
R=rand(4,4);
end
matlabpool close
注意:本章所有的接下来的例子都认为 MATLAB 池是开着的,并且在 spmd 语句之间 保持开放状态。
不像 parfor 循环,每一个 spmd 语句中使用的 lab 每一个都有一个独一无二的值 labindex。
这个让你指定代码使之只运行在某些 lab 上,或者指定执行,通常是为了访问唯一的数据。
据个例子,依赖 labindex 创建不同大小的数组。
Spmd(3)
if labindex ==1
R= rand(9,9);
else
R=rand(4,4);
end
根据 labindex 来从每一个 lab 上下载唯一的数据,在每一个 lab 上使用相同的函数计算
出一个结果。
spmd(3)
labdata=load(‘datafile_’ num2str(labindex) ‘.ascii’)
result=MyFunction(labdata) end
执行了一个 spmd 语句的 lab 同时操作并且知道彼此。正如一个并行的工作,你可以直 接控制不同 lab 间的通信,在他们之间传输数据,使用分布式数组。
对于一系列可以简化这种能力的工具箱函数,参见函数部分
Interlab Communication Within a Parallel Job and Codistributed Arrays.
举例,在一个 spmd 语句中使用分布式数组:
spmd (3)
RR = rand(30, codistributor());
end
每一个 lab 有一个 30*10 段的分布式数组。想要看关于分布式数组的更多信息,参见 Math with Codistributed Arrays.