执行了一个 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.
3.2 通过 Composites 访问数据
3.2.1 简介
在 MATLAB 客户端会话的 composite 对象让你直接在 lab 上获取数据值。多数情况下在 spmd 语句中分配这些变量。在他们的显示和使用中,Composites 类似于单元数组。有两种 方法来创建 Composite:
在客户端使用 Composite 函数。分配给该 Composites 元素的值存储在 lab 中。
定义变量在 lab 上 spmd 语句中。Spmd 语句中,作为 Composites,存储的值在客户 端是可以被访问。
3.2.2 在 spmd 语句中创建 composite
当您定义或在一个 spmd 语句内为变量分配了值,数据值便存储在 lab 上。
在 spmd 语句后,这些数据值作为 Composite 可以在客户端被访问。Composite 对象就 像单元数组,表现的很相似。在客户端,每个 Composite 为每个 lab 分配元素。例如,假设 您打开一个有三个本地工作者的 Matlab 池,并且在池中运行 spmd 语句:
matlabpool open local 3
spmd % Uses all 3 workers
MM = magic(labindex+2); % MM is a variable on each lab end
MM{1} % In the client, MM is a Composite with one element per lab
8 1 6
3 5 7
4 9 2
MM{2} 16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
一个变量可能无法定义在每个 lab 上。有关该变量没有定义的 lab,相应的 Composite 元素没有值。试图读取该元素将抛出一个错误。 spmd if labindex > 1 HH = rand(4) end end HH 1: No data 2: class = double, size = [4 4]
3: class = double, size = [4 4]
你也可以在从客户端设置 Composite 元素的值。这将引起数据的传输,把值存储在合适 的 lab 上,即使在 spmd 语句中并不执行: MM{3} = eye(4); 在这种情况下,MM 必须已经作为一个 Composite 存在,否则 Matlab 将其理解为一个 单元数组。 现在当你进入一个 spmd 语句,在 lab3 上变量 MM 的值被设置为: spmd if labindex == 3, MM, end end Lab 3: MM = 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
当你在客户端作业空间使用 Composite 元素明确的赋值一个变量,数据从 lab 传到客户 端 M = MM{1} % Transfer data from lab 1 to variable M on the client 8 1 6
3 5 7 4 9 2
将一个完整的 Composite 赋给另一个 Composite 并不引起数据传递。换而言之,客户端 仅仅是赋值 Composite 作为一个对 lab 上某些数据的引用:
NN = MM % Set entire Composite equal to another, without transfer
然而,访问一个 Composite 元素,来赋值给其他的 Composites,会导致数据从 lab 传输 到客户端,即使这个数据是赋给同样的 lab。在这种情况下,NN 必须已经作为一个 Composite 存在。
NN{1} = MM{1} % Transfer data to the client and then to lab 当结束的时候,你可以关闭池:
matlabpool close
3.2.3 变量的持久性和 spmd 的次序
存在 lab 上的值在 spmd 语句之间依然有效。这允许你顺次的使用多个 spmd 语句,并 且继续使用在 spmd 块中定义的相同的变量。
值依然保存在 lab 上直到相关的 Composites 在客户端被清理掉了,或者 Matlab 池被关 闭了。下面的例子说明了在 spmd 块中数字的值的生存期,使用一个有 4 个工作者的池。
matlabpool open local 4 spmd
AA = labindex; % Initial setting end
AA(:) % Composite [1]
[2]
[3]
[4]
spmd
AA = AA * 2; % Multiply existing value end
AA(:) % Composite [2]
[4]
[6]
[8]
clear AA % Clearing in client also clears on labs spmd; AA = AA * 2; end % Generates error matlabpool close
3.2.4 在 spmd 外创建 composite
Composite 函数不使用一个 spmd 语句,也可以创建 Composite 对象。这可能对于 lab 上 可重入变量值有用,在一个 spmd 语句开始在这些 lab 上执行之前。假设一个 MATLAB 池已 经打开了:
PP = Composite()
缺省情况下,创建一个 Composite,在 matlab 池中为每一个 lab 分一个元素。你也可以 创建 Composite 仅仅在池中的 lab 的几个子集上。参见 Compos ite 引文获取更多的细节。
Composite 的元素现在可以在客户端上像平时一样设置,或者像在 spmd 语句中的变量一样。
当你设置 Composite 中的元素的时候,数据立刻被传递到相应的 lab 中:
for ii = 1:numel(PP) PP{ii} = ii;
End