0

我曾经spmd同时计算两段代码。我正在使用的计算机有一个 8 核处理器。这意味着通信开销几乎为零!
我比较了这个块的运行时间和在withspmd之外的相同代码。 当我运行代码时,我的代码的并行版本比顺序形式花费更多时间。 知道为什么会这样吗? 这是我正在谈论的示例代码:spmdtic & 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);
4

1 回答 1

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);
于 2017-01-16T08:14:42.463 回答