我使用spmd
同时计算两段代码。我使用的计算机有一个8核的处理器。这意味着通信开销就像零!
我将此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);
答案 0 :(得分:1)
这里有两个原因。首先,你使用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);