【问题标题】:Why is SPMD running time bigger than sequential - matlab为什么 SPMD 运行时间大于顺序 - matlab
【发布时间】:2017-01-14 19:14:28
【问题描述】:

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

【问题讨论】:

  • “预分配”变量kesi 有用吗?例如kesi = zeros(size(...)) 第 2 行
  • 不,我以前做过,只是没有把它带到这里。

标签: matlab performance parallel-processing spmd


【解决方案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);

【讨论】:

  • 先生,您的这部分答案有官方参考吗? "(默认情况下)并行池工作程序以单计算线程模式运行。因此,当使用本地工作程序时,只有在并行构造的主体不能被 MATLAB 隐式多线程处理时,您才能期望加速。"
  • 这个 R2016b 发行说明暗示它 mathworks.com/help/distcomp/release-notes.html#bvczl_g-1 但恐怕我找不到更具体的文档链接。自从 2005 年(或者是 2004 年)第一次发布 Parallel Computing Toolbox 以来,情况肯定就是这样。
猜你喜欢
  • 1970-01-01
  • 2018-11-06
  • 2016-12-15
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多