在spmd块中使用parfor时出错 - matlab

时间:2017-01-05 20:16:08

标签: matlab parallel-processing parfor spmd

据我所知,Matlab中的并行编程,我们可以准确地指出工作人员做什么;使用:

if labindex == x 
    %some computations
end

我们也可以并行运行for个循环;使用:

parfor i1 = x:y
    %some computations
end

我使用的节点有几个节点,每个节点有8个核心 我想运行2个函数,每个函数包含一个parfor循环,每个函数都由一个worker执行,我的代码是这样的:

spmd
    if labindex == 1
        alpha  = forward( some parameters );
    end
    if labindex == 2
        beta  = backward( some parameters );
    end
end

我希望这2个函数由2个不同的节点同时执行。 但是Matlab抛出了这个错误:

PARFOR or SPMD can not be used inside an SPMD block.

为什么会这样? 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

parfor文档中包含了这一点:

  

parfor - 循环的主体不能包含另一个parfor循环。但它   可以调用包含另一个parfor - 循环的函数。

     

但是,因为工作人员无法打开并行池,所以工作人员不能   并行运行内部嵌套parfor - 循环。这意味着只有一个   嵌套parfor级别 - 循环可以并行运行。如果外循环   在并行池上并行运行,内部循环连续运行   每个工人。如果外部循环在客户端中连续运行(例如,   parfor指定零工作者),包含内部的函数   loop可以在池中的worker上并行运行内部循环。

spmd语句也是如此:

  

spmd语句的正文不能直接包含另一个spmd。   但是,它可以调用包含另一个spmd语句的函数。   内部spmd语句不会在另一个并行中并行运行   池,但在运行它的工作者的单个线程中串行运行   包含功能。

看起来你实际上可以嵌套spmd / parfor,只要它们被封装在函数中,但它们仍然不能并行运行,所以没有意义。