为什么 SPMD 运行 时间大于顺序 - matlab
Why is SPMD running time bigger than sequential - matlab
我用spmd
同时计算了两段代码。我正在使用的计算机有一个带有 8 cores.which 的处理器意味着通信开销几乎为零!
我将此 spmd
块的 运行ning 时间与 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);
这里有两个原因。首先,您使用 if labindex == 2
意味着 spmd
块的主体仅由一个工人执行 - 这里没有并行性。
其次,重要的是要记住(默认情况下)并行池工作者 运行 在单计算线程模式下。因此,当使用本地工作者时,只有当并行构造的主体不能被 MATLAB 隐式 multi-threaded 时,您才能期望加速。
最后,在这种特殊情况下,最好使用 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);
我用spmd
同时计算了两段代码。我正在使用的计算机有一个带有 8 cores.which 的处理器意味着通信开销几乎为零!
我将此 spmd
块的 运行ning 时间与 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);
这里有两个原因。首先,您使用 if labindex == 2
意味着 spmd
块的主体仅由一个工人执行 - 这里没有并行性。
其次,重要的是要记住(默认情况下)并行池工作者 运行 在单计算线程模式下。因此,当使用本地工作者时,只有当并行构造的主体不能被 MATLAB 隐式 multi-threaded 时,您才能期望加速。
最后,在这种特殊情况下,最好使用 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);