我使用spmd同时计算了两段代码。我使用的计算机有一个8 cores.which的处理器,这意味着通信开销几乎为零!
我比较了这个spmd块的运行时间以及spmd之外的相同代码和tic & toc。
当我运行代码时,并行版本的代码要比顺序形式花费更多的时间。
知道为什么会这样吗?
下面是我所说的示例代码:
tic;
spmd
if labindex == 1
gamma = (alpha*beta);
end
if labindex == 2
for t = 1:T,
for i1=1:n
for j1=1:n
kesi(i1,j1,t) = (alpha(i1,t) + phi(j1,t));
end;
end;
end;
end
end
t_spmd = toc;
tic;
gamma2= (alpha * beta);
for t = 1:T,
for i1=1:n
for j1=1:n
kesi2(i1,j1,t) = (alpha(i1,t) + phi(j1,t));
end;
end;
end;
t_seq = toc;
disp('t spmd : ');disp(t_spmd);
disp('t seq : ');disp(t_seq);发布于 2017-01-16 08:14:42
这里有两个原因。首先,使用if labindex == 2意味着spmd块的主体仅由一个工作人员执行-这里没有并行性。
其次,重要的是要记住(默认情况下)并行池工作人员在单个计算线程模式下运行。因此,在使用本地工作人员时,只有当您的并行结构的主体不能通过MATLAB隐式多线程时,才能期望加速。
最后,在这种特殊情况下,最好使用bsxfun (或R2016b或更高版本中的隐式扩展),如下所示:
T = 10;
n = 7;
alpha = rand(n, T);
phi = rand(n, T);
alpha_r = reshape(alpha, n, 1, T);
phi_r = reshape(phi, 1, n, T);
% In R2016b or later:
kesi = alpha_r + phi_r;
% In R2016a or earlier:
kesi = bsxfun(@plus, alpha_r, phi_r);https://stackoverflow.com/questions/41653937
复制相似问题