Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用parfor内部spmd块时出错-matlab_Matlab_Parallel Processing_Parfor_Spmd - Fatal编程技术网

使用parfor内部spmd块时出错-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

正如我在Matlab中所了解的,我们可以准确地指定工作人员做什么;使用:

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
来完成这一任务。