【问题标题】:Error using parfor inside spmd block - matlab在 spmd 块内使用 parfor 时出错 - matlab
【发布时间】:2017-01-05 20:16:08
【问题描述】:

据我所知,Matlab 中的并行编程,我们可以准确地指定什么 worker 做什么;使用:

if labindex == x 
    %some computations
end

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

parfor i1 = x:y
    %some computations
end

我正在使用一个有几个节点的集群,每个节点有 8 个核心。
我想运行 2 个函数,每个函数都包含一个 parfor 循环,每个函数都由工作人员执行,我的代码是这样的:

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.

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

【问题讨论】:

  • 在 Matlab 文档中添加了相关指针。您的代码似乎不应该抛出错误(至少不是根据最新的 Matlab 文档),因此如果您想在这里获得进一步的帮助,您应该提供 MCVE

标签: matlab parallel-processing parfor spmd


【解决方案1】:

parfor 文档中对此进行了介绍:

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

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

spmd 语句也是如此:

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

看来spmd/parfor其实是可以嵌套的,只要封装在函数中,但还是不会并行运行,所以没有意义。

【讨论】:

  • 您的答案很明确,但请考虑每个工作人员(我正在使用的集群的节点)都有一个具有 8 个内核的 cpu。在SPMD 块中,我为每个工作人员分配了一个包含PARFOR 的函数。这意味着工作人员可以自己打开一个并行池。那么在这种情况下会发生什么? PARFOR 循环是否并行执行?
  • 不管工人有多少核心,因为他们不能自己打开并行池。这是 Matlab 的一个限制,在我引用的文档中有明确的描述。您需要重构您的代码以避免嵌套 parfor/spmd,或者自己跨越多个 matlab 实例,而不是依靠 spmd 为您执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2013-06-01
相关资源
最近更新 更多