据我所知,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.
为什么会这样? 有什么想法吗?
答案 0 :(得分:1)
parfor
文档中包含了这一点:
parfor
- 循环的主体不能包含另一个parfor
循环。但它 可以调用包含另一个parfor
- 循环的函数。但是,因为工作人员无法打开并行池,所以工作人员不能 并行运行内部嵌套
parfor
- 循环。这意味着只有一个 嵌套parfor
级别 - 循环可以并行运行。如果外循环 在并行池上并行运行,内部循环连续运行 每个工人。如果外部循环在客户端中连续运行(例如,parfor
指定零工作者),包含内部的函数 loop可以在池中的worker上并行运行内部循环。
spmd
语句也是如此:
spmd
语句的正文不能直接包含另一个spmd
。 但是,它可以调用包含另一个spmd
语句的函数。 内部spmd
语句不会在另一个并行中并行运行 池,但在运行它的工作者的单个线程中串行运行 包含功能。
看起来你实际上可以嵌套spmd
/ parfor
,只要它们被封装在函数中,但它们仍然不能并行运行,所以没有意义。