主要内容

使用composite访问Worker变量

介绍复合材料

在MATLAB中的复合对象®客户端会话允许您直接访问工作人员的数据值。大多数情况下,你在内部分配这些变量spmd语句。在显示和使用方面,composite类似于单元格数组。有两种方法可以创建composite:

  • 使用复合客户端功能。分配给Composite元素的值存储在workers上。

  • 对象内部的worker上定义变量spmd声明。后spmd语句时,存储的值可以在客户机上以Composites的形式访问。

在spmd语句中创建复合语句

类中的变量定义或赋值时spmd语句时,数据值存储在workers上。

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

parpool (“本地”3)spmd%使用所有3个工人毫米=魔法(labindex + 2);% MM是每个工人的一个变量结束MM {1}在客户端,MM是一个Composite,每个worker有一个元素
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

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

spmd如果labindex > 1 HH = rand(4);结束结束HH
实验1:No data实验2:class = double, size = [4 4]

您还可以从客户端设置Composite元素的值。这将导致数据的传输,并将值存储在适当的worker上,即使它没有在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 1 1 0 0 0 1

当你在客户端工作空间中使用Composite元素显式赋值一个变量时,数据从工作人员转移到客户端:

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

将整个复合赋值给另一个复合不会导致数据传输。相反,客户端只是复制Composite作为存储在工作人员上的适当数据的引用:

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

但是,可以通过访问Composite的元素来将值分配给其他Composite导致数据从工人转移到客户端,即使分配到同一工人。在这种情况下,神经网络必须已经作为一个Composite存在:

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

完成后,可以删除该池:

删除(gcp)

spmd的可变持久性和序列

存储在worker上的值在两者之间保留spmd语句。这允许您使用多个spmd语句的顺序,并继续使用前面定义的相同变量spmd块。

在客户机上清除相应的composite或删除并行池之前,这些值将保留在工作者上。下面的示例演示了使用的数据值生命周期spmd使用四名工人组成的水池:

parpool (“本地”4)spmdAA = labindex;%初始设置结束AA (:)%复合
[1] [2] [3] [4]
spmdAa = Aa * 2;将现有值相乘结束AA (:)%复合
[2] [4] [6] [8]
清晰的AA%在客户端清除也清除工人spmd;Aa = Aa * 2;结束%生成错误删除(gcp)

在spmd语句之外创建复合语句

复合函数创建复合对象而不使用spmd声明。这对于在worker上预填充变量值是很有用的spmd语句开始在这些worker上执行。假设一个并行池已经在运行:

PP复合()=

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

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