主要内容

使用composite访问Worker变量

介绍复合材料

在MATLAB中合成对象®客户端会话允许您直接访问worker上的数据值。通常情况下,你会在内部分配这些变量spmd语句。在显示和使用方面,Composites类似于单元阵列。有两种方法来创建composite:

  • 使用复合函数。赋给Composite元素的值存储在工作器中。

  • 对象内部的工作器上定义变量spmd声明。后spmd语句,存储的值可以作为Composites在客户端上访问。

在spmd语句中创建composite

对象中的变量定义或赋值时spmd语句时,数据值存储在工人上。

spmd语句,这些数据值可以作为Composites在客户端上访问。复合对象类似于单元格数组,并且行为类似。在客户端,Composite每个worker有一个元素。例如,假设您创建了一个由三个本地工作者组成的并行池,并运行spmd关于该池的声明:

parpool (“本地”3)spmd使用所有3个工人毫米=魔法(labindex + 2);% MM是每个worker上的变量结束MM {1}%在客户端,MM是一个Composite,每个worker有一个元素
Ans = 8 1 6 3 5 7 4 9 2
MM {2}
Ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

变量可能不是在每个worker上都定义的。对于没有定义变量的worker,对应的Composite元素没有值。试图读取该元素会抛出错误。

spmd如果labindex > 1 HH = rand(4);结束结束HH
Worker 2: class = double, size = [4 4] Worker 3: class = double, size = [4 4]

您还可以从客户端设置Composite元素的值。这将导致数据的传输,将值存储在适当的工作者上,即使它没有在spmd声明:

MM{3} =眼(4);

在这种情况下,毫米必须已经存在作为一个复合,否则MATLAB将其解释为一个单元数组。

现在当你输入spmd语句中,变量的值毫米worker 3的设置如下:

spmd如果labindex == 3, MM,结束结束
工人3:MM = 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1

当你在客户端工作区中使用Composite元素显式地分配一个变量时,数据从worker传输到客户端:

M = MM {1}在客户端将数据从worker 1传输到变量M
M = 8 1 6 3 5 7 4 9 2

将整个组合分配给另一个组合并不会导致数据传输。相反,客户端只是复制Composite作为对存储在worker上的相应数据的引用:

NN =毫米%设置整个复合等于另一个,不转移

但是,访问Composite的元素来为其他Composite赋值结果是数据从工人转移到客户端,即使分配给同一工人。在这种情况下,神经网络必须已经以复合类型存在:

神经网络{1}{1}=毫米将数据传送到客户端,然后再传送给工作人员

完成后,可以删除该池:

删除(gcp)

spmd的持久性和序列

存储在工人上的值被保留在中间spmd语句。这允许您使用多个spmd语句,并继续使用前面定义的相同变量spmd块。

这些值将保留在worker上,直到客户端上相应的Composites被清除,或者直到并行池被删除。下面的示例说明了数据值的生命周期spmdblock,使用一个由四个工人组成的池:

parpool (“本地”4)spmdAA = labindex;%初始设置结束AA (:)%复合
Ans = 4×1 cell array {[1]} {[2]} {[3]} {[4]}
spmdAa = Aa * 2;%乘以现有值结束AA (:)%复合
Ans = 4×1 cell array {[2]} {[4]} {[6]} {[8]}
清晰的AA%清除客户端也清除工作端spmdAa = Aa * 2;结束%生成错误删除(gcp)
分析和传输文件给工人…完成了。在工人2 3 4检测到错误。导致:在工作器上抛出了一个UndefinedFunction错误。这可能是因为包含'AA'的文件在工人上是不可访问的。使用命令:addAttachedFiles(pool,…)指定这个并行池所需的文件。有关更多细节,请参阅parpool的文档。无法识别的函数或变量'AA'。

在spmd语句外创建复合材料

复合函数创建复合对象而不使用spmd声明。在对象之前预先填充工作器上的变量值可能很有用spmd语句开始在这些工作者上执行。假设一个并行池已经在运行:

PP复合()=

默认情况下,这会为并行池中的每个worker创建一个带有元素的Composite。您也可以只在池中的工人子集上创建composite。有关详细信息,请参阅Composite reference页面。组合的元素现在可以像往常一样在客户端上设置,或者作为变量在spmd声明。当你设置一个Composite的元素时,数据会立即被传输到相应的worker:

i = 1:numel(PP) PP{ii} = ii;结束