【问题标题】:Difference between distributed and non-distributed arrays in MATLABMATLAB中分布式和非分布式数组的区别
【发布时间】:2015-02-12 12:44:44
【问题描述】:

假设我们在 MATLAB 中有这段代码:

parpool('local',2) % Create a parallel pool
W = ones(6,6);
W = distributed(W); % Distribute to the workers
spmd
    T = W*2; % Calculation performed on workers, in parallel
    % T and W are both codistributed arrays here
end
T % View results in client.
whos % T and W are both distributed arrays here
delete(gcp) % Stop pool
  1. 我在文档中看到普通数组和分布式数组之间的区别是:当我们使用分布式数组时,这些数组直接发送给工作人员,客户端上没有任何数组。所以我们无法在客户端访问这些数组?这只是差异吗?

  2. 如果我们去掉W = distributed(W);这一行,代码的结构和输出有什么区别?使用分布式数组的目的是什么?

  3. distributedcodistributed 有什么区别。正如我在文档中所读到的,我们只能在 spmd 块中使用 codistributed。真的吗?

【问题讨论】:

  • 这个问题对我来说似乎有点太宽泛了......

标签: matlab parallel-processing parfor


【解决方案1】:

分布式数组存储在工作人员上,而不是客户端上,对它们的操作由工作人员并行执行 - 这就是它们的意义所在。

分布式数组和协分布式数组的区别只是一种视角。从客户端的角度来看,它们是分布式数组;从工人的角度来看,它们是共同分布的数组。

为了说明,首先启动一个池:

>> parpool('local',2)

创建一个数组:

>> W = ones(6,6);

W 存储在客户端上。

现在从W 创建一个分布式数组:

>> V = distributed(W);

V 存储在工人身上,分布在每个工人身上。您仍然可以从客户端访问 V,但是当您这样做时,它会将 V 从工作人员那里拉回。

>> V
V =
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1 

请注意,在工作区浏览器中,V 是 6x6 分布式数组,而不是像 W 这样的 6x6 双精度数组。

现在虽然从客户端的角度来看V 是一个分布式数组,但从worker 的角度来看,V 是一个协同分布式数组。

>> spmd; disp(V); end
Lab 1: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

Lab 2: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

您可以看到 V 是共同分布的,并且每个工作人员只存储了一半 (6x3)。

当您使用 V 执行某些操作时,会在工作人员身上并行发生,并将结果作为分布式/协同分布式数组存储在工作人员上:

>> spmd; T = V*2; end
>> spmd; disp(T); end
Lab 1: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

Lab 2: 
          LocalPart: [6x3 double]
      Codistributor: [1x1 codistributor1d]

您可以像使用V 一样从客户端访问T,但要明确将其恢复,请使用gather

>> S = gather(T);

请注意,S 现在是 6x6 双精度,而不是分布式数组。

【讨论】:

  • 感谢山姆的回答。那么在spmd 块中定义coddistributedarray 的目的是什么?我们如何在您的代码中使用这种结构?假设我们在spmd 块中有ones(6,6,'coddistributed')
  • 好吧,您可能希望在您的 spmd 块中创建共同分布的变量。该语法允许您这样做。例如,如果您尝试spmd; X = ones(6,6, 'codistributed'); endX 将是一个分布式(来自客户端)或协同分布(来自工作人员)数组。这可能是一件有用的事情——当然你也可以做比ones 更复杂的事情。
  • 所以我们在两种结构中都有相同的功能?这是真的吗?
  • 它们不是两种不同的结构。分布式数组 codistributed 数组。当您在客户端时,您(和代码)将它们视为分布式数组。当您在工作人员上时,您(和代码)将它们视为共同分布的数组。它是同一个数组,只是以两种不同的方式描述和看待。
  • 为了强调,在我的回答中创建V。然后输入class(V)。你会看到distributed。现在输入spmd; disp(class(V)); end。您会看到两个工作人员都将其视为codistributed
【解决方案2】:

To 1.) 当然还有其他细微的差异,但至少索引和操作其元素的方式应该是相同的。

至 2.) 您可以轻松地自己尝试。无论如何,结果是Composite,这是在执行spmd 块并执行多次计算并存储每个结果时复制到每个工作人员的正常数组方式。我会为常量输入数据(参数)使用“正常”类型,而对于用于计算输出(并定义它们的大小)的变量,我会使用 distributed

例子:

x = distributed(1:100); % variable, output will be calculated on -> distributed
a = 5; % amplitude (constant parameter -> "normal")
spmd
  y = a * sin(x);
end
y

这也解释了distributed的用途:在矩阵上启用并行计算。

To 3.: Distributed 表示它的元素分布在工人身上。 Codistributed 意味着它的元素也被传播,但以同样的方式传播到同样是 distributed 的东西(其中包括相同的大小)。我猜想(但不确定)只要并行池保持打开状态,codistributed 属性就会保持不变,但从 spmd 块外部,它们只能作为distributed 数组访问。

documentation 说:

您在 spmd 语句中创建的工作人员的共同分布式数组 或从通信作业的任务功能中访问 客户端上的分布式数组。

【讨论】:

    猜你喜欢
    • 2023-01-05
    • 2018-03-10
    • 1970-01-01
    • 2017-11-20
    • 2015-12-12
    • 2012-03-20
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多