关于问题#1,Composite
客户端中的变量基本上指的是非分布式的变体数组存储在工人身上。您可以通过以下方式从每个工作人员访问该数组{}
- 使用相应的 labindex 进行索引(例如:spectrum{1}
, spectrum{2}
, ..).
对于您的代码将是:finalSpectrum = sum(cat(2,spectrum{:}), 2);
现在我自己使用随机数据尝试了这个问题。下面是要比较的三种实现(请参阅此处以了解之间的区别分布式和非分布式数组 http://www.mathworks.com/help/distcomp/nondistributed-versus-distributed-arrays.html)。首先我们从常用数据开始:
len = 100; % spectrum length
K = 10; % number of peaks
X = 1:len;
% random position and shape parameters
a = rand(1,K); b = rand(1,K); c = rand(1,K);
% random peak ranges (lower/upper thresholds)
ranges = sort(randi([1 len], [2 K]));
% dummy peakfn() function
fcn = @(x,a,b,c) x+a+b+c;
% prepare a pool of MATLAB workers
matlabpool open
1)串行for循环:
spectrum = zeros(size(X));
for i=1:size(ranges,2)
r = ranges(:,i);
idx = (r(1) <= X & X <= r(2));
spectrum(idx) = spectrum(idx) + fcn(X(idx), a(i), b(i), c(i));
end
s1 = spectrum;
clear spectrum i r idx
2) SPMD 复合阵列
spmd
spectrum = zeros(1,len);
ind = labindex:numlabs:K;
for i=1:numel(ind)
r = ranges(:,ind(i));
idx = (r(1) <= X & X <= r(2));
spectrum(idx) = spectrum(idx) + ...
feval(fcn, X(idx), a(ind(i)), b(ind(i)), c(ind(i)));
end
end
s2 = sum(vertcat(spectrum{:}));
clear spectrum i r idx ind
3)具有共分布阵列的SPMD
spmd
spectrum = zeros(numlabs, len, codistributor('1d',1));
ind = labindex:numlabs:K;
for i=1:numel(ind)
r = ranges(:,ind(i));
idx = (r(1) <= X & X <= r(2));
spectrum(labindex,idx) = spectrum(labindex,idx) + ...
feval(fcn, X(idx), a(ind(i)), b(ind(i)), c(ind(i)));
end
end
s3 = sum(gather(spectrum));
clear spectrum i r idx ind
所有三个结果应该相等(在可接受的小误差范围内)
>> max([max(s1-s2), max(s1-s3), max(s2-s3)])
ans =
2.8422e-14