• 沒有找到結果。

通过 Composites 访问数据

执行了一个 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

相關文件