使用parfor内部spmd块时出错-matlab
正如我在Matlab中所了解的,我们可以准确地指定工作人员做什么;使用:使用parfor内部spmd块时出错-matlab,matlab,parallel-processing,parfor,spmd,Matlab,Parallel Processing,Parfor,Spmd,正如我在Matlab中所了解的,我们可以准确地指定工作人员做什么;使用: if labindex == x %some computations end 我们还可以并行运行for循环;使用: parfor i1 = x:y %some computations end 我使用的集群有几个节点,每个节点有8个核心。 我想运行两个函数,每个函数都包含一个parfor循环,每个函数都由一个工人执行,我的代码是这样的: spmd if labindex == 1
if labindex == x
%some computations
end
我们还可以并行运行for
循环;使用:parfor i1 = x:y
%some computations
end
我使用的集群有几个节点,每个节点有8个核心。我想运行两个函数,每个函数都包含一个
parfor
循环,每个函数都由一个工人执行,我的代码是这样的:spmd
if labindex == 1
alpha = forward( some parameters );
end
if labindex == 2
beta = backward( some parameters );
end
end
我希望这两个函数由两个不同的节点同时执行。
但是Matlab抛出了这个错误:PARFOR or SPMD can not be used inside an SPMD block.
为什么会这样?
有什么想法吗?这在文档中有介绍:
parfor
-循环的主体不能包含另一个parfor
-循环。但是它
可以调用包含另一个parfor
-循环的函数
但是,由于工作进程无法打开并行池,因此工作进程无法打开并行池
并行运行内部嵌套的parfor
-循环。这意味着只有一个
嵌套的parfor
级别-循环可以并行运行。如果外环
在并行池上并行运行,内部循环在
每个工人。如果外部循环在客户端连续运行(例如。,
parfor
指定零工作者),包含内部
循环可以在池中的工作线程上并行运行内部循环
以下语句也是如此:
spmd
语句的主体不能直接包含另一个spmd
。
但是,它可以调用包含另一条spmd
语句的函数。
内部spmd
语句不会在另一个并行中并行运行
池,但在运行其
包含函数
看起来,实际上可以使用嵌套的
spmd
/parfor
,只要它们封装在函数中,但它们仍然不会并行运行,因此没有意义。在Matlab文档中添加了相关指针。似乎你的代码不应该抛出一个错误(至少不是根据最新的MATLAB文档),所以如果你想在这里得到更多的帮助,你应该提供。你的答案是清楚的,但是考虑到每个工人(我正在使用的集群的节点)都有一个8核的CPU。在SPMD
块中,我为每个工人分配一个包含PARFOR
的函数。这意味着工作者可以自己打开一个并行池。那么在这种情况下会发生什么呢?PARFOR
循环是并行执行的吗?工作人员拥有多少内核并不重要,因为他们自己无法打开并行池。这是Matlab的一个限制,在我引用的文档中有明确描述。您需要重构代码以避免嵌套的parfor
/spmd
,或者自己跨多个matlab实例,而不是依赖spmd
来完成这一任务。