为什么SPMD的运行时间大于顺序 - matlab

时间:2017-01-14 19:14:29

标签: matlab performance parallel-processing spmd

我使用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);

1 个答案:

答案 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);