主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

分发数组并运行 SPMD

分布式数组

并行池中的工作单元相互通信,因此您可以在工作单元之间分配一个数组。每个工作单元都包含数组的一部分,并且所有工作单元都知道每个工作单元拥有数组的哪一部分。

使用 distributed 函数在工作单元之间分配数组:

M = magic(4) % a 4-by-4 magic square in the client workspace
MM = distributed(M)

现在 MM 是一个分布式数组,相当于 M,您可以像任何其他数组一样操作或访问其元素。

M2 = 2*MM;  % M2 is also distributed, calculation performed on workers
x = M2(1,1) % x on the client is set to first element of M2

单程序多数据 (spmd)

单程序多数据 (spmd) 构造允许您定义在并行池中的所有工作单元上并行运行的代码块。spmd 代码块可以在池中的部分或全部工作单元上运行。

spmd     % By default creates pool and uses all workers
    R = rand(4);
end

此代码为池中的每个工作单元创建一个单独的 4×4 矩阵 R,其中包含随机数。

Composite 对象

spmd 语句之后,在客户端上下文中,可以访问来自代码块的值,即使数据实际上存储在工作单元上。在客户端,这些变量被称为 Composite 对象。Composite 的每个元素都是一个符号,引用池中工作单元的值(数据)。请注意,由于变量可能未在每个工作单元上定义,因此 Composite 可能包含未定义的元素。

继续上面的示例,在客户端,Composite R 为每个工作单元提供了一个元素:

X = R{3};  % Set X to the value of R from worker 3.

上面这一行从工作单元 3 中检索数据来分配 X 的值。以下代码将数据发送给工作单元 3:

X = X + 2;
R{3} = X; % Send the value of X from the client to worker 3.

如果并行池在 spmd 语句之间保持打开状态并使用相同的工作单元,则每个工作单元上的数据会从一个 spmd 语句保留到另一个语句。

spmd
    R = R + spmdIndex  % Use values of R from previous spmd.
end

spmd 的典型用途是在多个工作单元上运行相同的代码,每个工作程序访问不同的数据集。例如:

spmd
    INP = load(['somedatafile' num2str(spmdIndex) '.mat']);
    RES = somefun(INP)
end

然后,从客户端可以访问工作单元上的 RES 的值,例如工作单元 1 上的 RES{1}、工作单元 2 上的 RES{2} 等等。

与索引元胞数组类似,索引 Composite 数组也有两种形式:

  • AA{n} 从工作单元 AA 返回 n 的值。

  • AA(n) 从工作单元 AA 返回 n 内容的元胞数组。

尽管只要并行池保持打开状态,数据就会从一个 spmd 代码块保留到另一个代码块上的工作单元上,但数据不会从一个并行池实例保留到另一个并行池实例上。也就是说,如果删除该池并创建一个新池,则第一个池中的所有数据都将丢失。

有关使用分布式数组、spmd 和 Composite 的详细信息,请参阅 分布式数组

另请参阅

| |

主题