MATLAB中分布式和非分布式阵列的区别

时间:2015-02-12 12:44:45

标签: matlab parallel-processing parfor

假设我们在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之间有什么区别。正如我在文档中读到的那样,我们只能在codistributed块中使用spmd。这是真的吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

>> 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的角度来看是一个分布式数组,但从工作者的角度来看,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]

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

>> S = gather(T);

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

答案 1 :(得分:1)

至1.)肯定存在其他微小差异,但至少你索引和操纵其元素的方式应该是相同的。

至2.)你可以轻松地尝试自己。无论如何,结果是Composite,这是在执行spmd块时复制到每个工作者的正常数组方式,并且计算执行多次并且存储每个结果。我会将“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的目的:在矩阵上启用并行计算。

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

documentation说:

  

您在spmd语句中创建的工作线程上的Codistributed数组   或者从通信作业的任务功能中可以访问   客户端上的分布式数组。