0

正如我所知道的 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.

为什么呢?任何想法?

4

1 回答 1

0

这包含在parfor文档中:

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

但是,由于 worker 无法打开并行池,因此 worker 无法并行运行内部嵌套parfor循环。这意味着只有一层嵌套parfor循环可以并行运行。如果外部循环在并行池上并行运行,则内部循环在每个工作人员上串行运行。如果外循环在客户端串行运行(例如, parfor指定零个工人),则包含内循环的函数可以在池中的工人上并行运行内循环。

spmd语句也是如此:

语句的主体spmd不能直接包含另一个spmd。但是,它可以调用包含另一个spmd语句的函数。内部spmd语句不在另一个并行池中并行运行,而是在运行其包含函数的工作线程上的单个线程中串行运行。

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

于 2017-01-05T21:44:56.543 回答