parfor循环cannot的主体包含一个break
语句。注意:
parfor语句的工作原理是分解循环的迭代,并在多个MATLAB工作线程上运行这些迭代。使用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
有没有什么常用的方法来模仿一个声部的中断?
3条答案
按热度按时间8nuwlpux1#
有一种方法可以在try/catch中执行parfor并使用Matlab的“throw”或“throwAsCaller”错误异常处理来中断parfor。它允许检测中断条件并执行条件代码,同时允许执行中断parfor循环后的任何代码。首先,用任意数量的工作线程启动并行池。在下面的代码中,我在parfor循环中生成了一个“fault”条件,方法是在0到1之间选择一个随机数,如果该数小于0.9,则parfor循环继续,如果大于0.9,则代码跳出parfor循环,执行catch语句中的一些条件代码,然后继续执行后续代码。我在catch中显示ME异常只是为了说明您可以检测到导致中断条件的循环变量“i”的值。顺便说一句,我在R2019 a上进行了测试。
nkkqxpd92#
恐怕你不能用break语句之类的语句来退出parfor循环,因为循环的执行顺序是完全任意的。
你有没有可能用spmd块来代替?用它们你可以让每个工作者知道一些条件是否被满足/违反,例如,这样就可以更好地控制程序的流程。这可能更多的是一个评论而不是一个回答,对不起;不过我觉得评论太长了。
rkkpypqq3#
没有办法中断,但是如果定义了一个逻辑条件,则可以使用它来跳过parfor counter,并且仍然使用parfor处理的优点,以换取跳过一些计数器编号的轻微代价。
另外,如果可能的话,使用简单的for循环,它更适合小程序,我通常使用parfor进行具有多层for循环和巨大处理的重型蒙特卡罗模拟。
你也可以在小块上运行parfor,然后把它放在while或另一个parfor循环中。