分发数组并运行 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 的详细信息,请参阅 分布式数组。
另请参阅
distributed
| spmd
| Composite