分发数组并运行SPMD

分布式阵列

并行池中的worker相互通信,因此可以在这些worker之间分布一个数组。每个worker都包含数组的一部分,并且所有的worker都知道每个worker拥有数组的哪一部分。

使用分布式函数在工人之间分配一个数组:

M =魔法(4)% a客户机工作区中的4×4魔法方块毫米=分布式(M)

现在毫米一个分布式数组,等价于,您可以使用与其他数组相同的方式操作或访问它的元素。

M2 = 2 *毫米;% M2也是分布的,对workers进行计算x = M2 (1, 1)客户机上的% x被设置为M2的第一个元素

单程序多数据(spmd)

单程序多数据(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和复合,明白了吧分布式阵列