为什么 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);