并行池中的worker相互通信,因此可以在这些worker之间分布一个数组。每个worker都包含数组的一部分,并且所有的worker都知道每个worker拥有数组的哪一部分。
使用分布式
函数在工人之间分配一个数组:
M =魔法(4)% a客户机工作区中的4×4魔法方块毫米=分布式(M)
现在毫米
一个分布式数组,等价于米
,您可以使用与其他数组相同的方式操作或访问它的元素。
M2 = 2 *毫米;% M2也是分布的,对workers进行计算x = M2 (1, 1)客户机上的% x被设置为M2的第一个元素
单程序多数据(spmd
构造允许您定义一个代码块,该代码块在并行池中的所有工作程序上并行运行。的spmd
块可以在池中的部分或所有工作器上运行。
spmd%默认情况下创建池并使用所有workerR =兰德(4);结束
这段代码创建了一个单独的4×4矩阵,R
,表示池中每个worker的随机数。
后一个spmd
语句中,在客户机上下文中,可以访问来自块的值,即使数据实际上存储在workers上。在客户机上,调用这些变量复合对象。组合的每个元素都是引用池中worker上的值(数据)的符号。注意,由于变量可能不是在每个worker上定义的,所以复合可能有未定义的元素。
继续上面的示例,在客户机上的组合R
每个worker有一个元素:
X = R {3};%从worker 3中设置X为R的值。
上面的行从worker 3检索数据,并将值赋给X
。以下代码发送数据给worker 3:
X = X + 2;R {3} = X;%将X的值从客户端发送到worker 3。
如果平行池之间保持开放spmd
语句和使用相同的worker时,每个worker的数据从一个worker持久化spmd
声明到另一个地方。
spmdR = R + labindex使用以前spmd中R的值。结束
的典型用途spmd
是在多个worker上运行相同的代码,每个worker访问不同的数据集。例如:
spmd输入=负载([“somedatafile”num2str (labindex)“.mat”]);RES = somefun(输入)结束
那么RES
对工人是可访问的从客户RES {1}
从工人1,RES {2}
来自工人2等。
有两种形式的索引组合,可比索引一个单元格数组:
AA {n}
返回的值AA
从工人n
。
AA (n)
的内容的单元格数组AA
从工人n
。
虽然数据从一个工人持续spmd
只要并行池保持打开状态,数据就不会从并行池的一个实例持久化到另一个实例。也就是说,如果删除了池并创建了一个新池,则第一个池中的所有数据将丢失。
有关使用分布式数组的更多信息,请spmd
和复合,明白了吧分布式阵列。