MATLAB中分布式和非分布式数组的区别

Difference between distributed and non-distributed arrays in MATLAB

假设我们在 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。是吗?

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

至 2.) 您可以轻松地自己尝试一下。不管怎样,结果是一个Composite,也就是在spmd块的执行中复制给每个worker的正常数组方式,多次计算并存储每个结果。我会将 "normal" 类型用于常量输入数据(参数),将 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 说:

Codistributed arrays on workers that you create inside spmd statements or from within task functions of communicating job can be accessed as distributed arrays on the client.

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

分布式阵列和共分布式阵列之间的区别只是角度之一。从客户端的角度来看,它们是分布式数组;从工人的角度来看,它们是共分布的数组。

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

>> parpool('local',2)

创建数组:

>> W = ones(6,6);

W 存储在客户端。

现在从 W:

创建一个分布式数组
>> V = distributed(W);

V 存储在 worker 上,分布在每个 worker 上。您仍然可以从客户端访问 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是一个分布式数组,但是从工作人员的角度来看,V是一个共分布式数组。

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

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

您可以看到 V 是共同分布的,并且只有一半 (6x3) 存储在每个 worker 上。

当你用 V 做某事时,它会并行发生在 worker 上,结果作为 distributed/codistributed 数组存储在 worker 上:

>> 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 双精度数,而不是分布式数组。