1

parfor 循环的主体不能包含break语句。:

parfor 语句通过分解循环的迭代并在多个 MATLAB worker 上运行这些迭代来工作。使用 break 和 return 语句意味着循环的后续迭代不应在这两个语句中的任何一个执行后运行。因此,循环迭代必须按顺序运行。但是,为了使 parfor 循环有效,运行连续循环迭代的结果不能取决于它们运行的​​顺序。

例如以下将不起作用:

if matlabpool('size') == 0 % checking to see if my pool is already open
    matlabpool(2)
end

parfor i=1:10
    inv(rand(1000))
    break
end

有什么常用的方法来模仿parfor中的休息吗?

4

2 回答 2

2

恐怕您无法使用诸如 break 语句之类的语句退出 parfor 循环,因为执行循环的顺序完全是任意的。

您可以使用 spmd 块代替吗?有了它们,您可以让每个工人知道是否满足/违反了某些条件,从而更好地控制程序的流程。抱歉,这可能更像是评论而不是答案;我虽然评论太长了。

于 2014-08-23T02:19:06.720 回答
0

没有办法打破,但是如果你定义了一个逻辑条件,你可以使用它来跳过 parfor 计数器,并且仍然使用 parfor 处理的优点,以换取跳过一些计数器编号的轻微费用。例如

parfor i=1:10
    if (i>= 5)
       continue;
    end
    inv(rand(1000))
end

另外,如果可能的话,使用简单的 for 循环,它更适合小程序,我通常使用 parfor 进行具有多层 for 循环和巨大处理的重型蒙特卡罗模拟。

您还可以在小块上运行 parfor 并将其放入 while 或另一个 parfor 循环中。例如,假设您要运行具有“mounte_num = 10000”次迭代的程序。定义“monte_temp = mounte_num / 100”并像这样

temp = 0
while (temp <= 100)
     parfor i=1:monte_temp 
           WHATEVER;
     end
     temp = temp + 1;
end
于 2020-12-26T18:25:07.393 回答