MATLAB中分布式阵列与非分布式阵列的区别
假设我们在MATLAB中有以下代码:MATLAB中分布式阵列与非分布式阵列的区别,matlab,parallel-processing,parfor,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 % V
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),代码的结构和输出会有什么不同代码>行?使用分布式阵列的目的是什么
分布式
和协同分布式
之间有什么区别。正如我在文档中所读到的,我们只能在spmd
块中使用coddistributed
。这是真的吗spmd
块时复制到每个工作程序的正常数组方式,并且多次执行计算并存储每个结果。对于常量输入数据(参数),我将使用“正常”类型;对于用于计算输出(并定义其大小)的变量,我将使用分布式
例如:
x = distributed(1:100); % variable, output will be calculated on -> distributed
a = 5; % amplitude (constant parameter -> "normal")
spmd
y = a * sin(x);
end
y
这也解释了分布式的目的:在矩阵上启用并行计算
到3.:分布式
意味着其元素分布在工人身上Codistributed
意味着其元素也以同样的方式分布到同样分布的事物上(其中包括同等大小)。我猜(但不确定)只要并行池保持打开状态,coddistributed
属性就会保持不变,但是从spmd块外部,它们只能作为分布式
数组访问
报告说:
在spmd语句中创建的辅助对象上的共同分配数组
或从任务内部访问通信作业的功能,如下所示:
客户端上的分布式阵列
当然还有其他一些小差异,但至少索引和操作其元素的方式应该是相同的
你可以很容易地自己试一试。无论如何,结果是一个,即在执行spmd
块时复制到每个工作程序的正常数组方式,并且多次执行计算并存储每个结果。对于常量输入数据(参数),我将使用“正常”类型;对于用于计算输出(并定义其大小)的变量,我将使用分布式
例如:
x = distributed(1:100); % variable, output will be calculated on -> distributed
a = 5; % amplitude (constant parameter -> "normal")
spmd
y = a * sin(x);
end
y
这也解释了分布式的目的:在矩阵上启用并行计算
到3.:分布式
意味着其元素分布在工人身上Codistributed
意味着其元素也以同样的方式分布到同样分布的事物上(其中包括同等大小)。我猜(但不确定)只要并行池保持打开状态,coddistributed
属性就会保持不变,但是从spmd块外部,它们只能作为分布式
数组访问
报告说:
在spmd语句中创建的辅助对象上的共同分配数组
或从任务内部访问通信作业的功能,如下所示:
客户端上的分布式阵列
分布式阵列存储在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
是协同分布的,每个worker上只存储了其中的一半(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
一样,但要显式地将其带回来,请使用collect
:
>> S = gather(T);
请注意,S
现在是一个6x6双精度阵列,而不是分布式阵列。分布式阵列存储在worker上,而不是客户端,并且由worker并行执行对它们的操作-这就是它们的要点
>> spmd; disp(V); end
Lab 1:
LocalPart: [6x3 double]
Codistributor: [1x1 codistributor1d]
Lab 2:
LocalPart: [6x3 double]
Codistributor: [1x1 codistributor1d]
分布式阵列和协同分布式阵列之间的区别只是一个方面。从客户端的角度来看,它们是分布式阵列;从工作者的角度来看,它们是共同分布的数组
如图所示,首先启动一个池:
>> 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双精度阵列。