假设我们在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
我在文档中读到普通数组和分发数组之间的区别是:当我们使用分布式数组时,这些数组直接发送给工作者,客户端上没有任何数组。所以我们在客户端没有任何访问这些数组的权限?这只是差异吗?
如果删除W = distributed(W);
行,代码的结构和输出有什么不同?使用分布式阵列的目的是什么?
distributed
和codistributed
之间有什么区别。正如我在文档中读到的那样,我们只能在codistributed
块中使用spmd
。这是真的吗?
答案 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
数组访问。
您在spmd语句中创建的工作线程上的Codistributed数组 或者从通信作业的任务功能中可以访问 客户端上的分布式数组。