Main Content

本页采用了机器翻译。点击此处可查看英文原文。

创建和使用分布式数组

如果您的数据当前位于本地机器的内存中,则可以使用 distributed 函数将现有数组从客户端工作区分发到并行池的工作进程。分布式数组使用并行池中多个工作进程的组合内存来存储数组的元素。有关分区数据的其他方法,请参阅 将数组分发给并行工作进程。您可以将整个数组作为单个实体进行操作,但是,工作进程仅对其所属的数组部分进行操作,并在必要时自动在它们之间传输数据。您可以使用分布式数组来扩展大数据计算。当您可以访问集群时,请考虑使用分布式数组,因为您可以合并集群中多台机器的内存。

distributed 数组是一个单一变量,分布在并行池中的多个工作进程上。您可以将此变量作为单一实体来使用,而不必担心其分布式特性。要探索 Parallel Computing Toolbox™ 中分布式数组可用的功能,请参阅 使用分布式数组运行 MATLAB 函数

当您创建 distributed 数组时,您无法控制分布的细节。另一方面,codistributed 数组允许您控制分布的所有方面,包括维度和分区。下面,您将学习如何创建 distributedcodistributed 数组。

创建分布式数组

您可以通过不同的方式创建分布式数组:

  • 使用 distributed 函数将现有数组从客户端工作区分发到并行池的工作进程。

  • 您可以直接在工作进程上构建一个分布式数组。您不需要首先在客户端创建数组,这样可以减少客户端工作区内存要求。可用的函数包括 eye(___,"distributed")rand(___,"distributed") 等。有关完整列表,请参阅 distributed 对象参考页面的替代功能部分。

  • 要在 spmd 语句内创建 codistributed 数组,请参阅 单程序多数据 (spmd)。然后在 spmd 语句之外将其作为 distributed 数组进行访问。这使您可以使用默认方案以外的分发方案。

在此示例中,您在客户端工作区中创建一个数组,然后将其转变为分布式数组。

如果您没有打开现有的池,请创建一个新的池。

parpool("Processes",4)

在客户端创建一个神奇的 4×4 矩阵,并将该矩阵分发给工作进程。在客户端上查看结果并显示有关变量的信息。

A = magic(4);
B = distributed(A);
B
whos
  Name      Size            Bytes  Class                   Attributes

  A         4x4               128  double                            
  B         4x4               128  distributed                       
  

您已将 B 创建为 distributed 数组,并将其拆分到并行池中的工作进程上。如下图所示。分布式数组已准备好进行进一步的计算。

Array split by column over four workers.

使用完分布式数组后,请关闭池。

delete(gcp)

创建协同分布数组

distributed 数组不同,codistributed 数组允许您控制分布的所有方面,包括维度和分区。您可以通过不同的方式创建 codistributed 数组:

  • 对较大的数组进行分区 - 从在所有工作进程上复制的大型数组开始,然后对其进行分区,以便将各个部分分布在各个工作进程上。当您有足够的内存来存储初始复制数组时,这非常有用。

  • 从较小的数组构建 - 从存储在每个工作进程上的较小的复制数组开始,然后将它们组合起来,以便每个数组成为更大的协同分布数组的一部分。这种方法允许您从较小的部分构建协同分布数组,从而减少内存要求。

  • 使用 MATLAB 构造函数 - 使用任何 MATLAB® 构造函数(例如 randzeros)以及 codistributor 对象参量。这些函数提供了一种快速构建任意大小的协同分布数组的方法,只需一步。

在此示例中,您在 spmd 语句内创建了一个 codistributed 数组,使用了非默认分布方案。

创建一个具有两个工作进程的并行池。

parpool("Processes",2)

在 spmd 语句中,沿第三维定义一维分布,其中工作进程 1 有 4 个部分,工作进程 2 有 12 个部分。然后创建一个 3×3×16 的零数组。在客户端查看 codistributed 数组,显示变量的信息。

spmd
    codist = codistributor1d(3,[4,12]);
    Z = zeros(3,3,16,codist);
    Z = Z + spmdIndex;
end
Z
whos
  Name        Size              Bytes  Class          Attributes

  Z           3x3x16             1152  distributed              
  codist      1x2                 265  Composite 

使用完协同分布数组后,请关闭池。

delete(gcp)

有关协同分布数组的更多详细信息,请参阅 使用协同分布数组

相关主题