matlab 有没有什么常用的方法来模仿一个声部的中断?

brc7rcf0  于 2022-11-30  发布在  Matlab
关注(0)|答案(3)|浏览(169)

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

有没有什么常用的方法来模仿一个声部的中断?

8nuwlpux

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上进行了测试。

function parfor_break_test
  disp('Do something outside parfor ...')
  disp('Now execute the parfor inside a try/catch ...')
  try
    parfor i=1:10
      fprintf('Do something inside parfor w/ i=%d ...\n',i)
      if rand > 0.9
        ME = MException('parfor:break',sprintf('Breaking out of parfor @ i=%d ...',i));
        throw(ME)
      end
      disp('No fault, so do something else inside the parfor ...')
      pause(0.1)
    end
  catch ME
    fprintf('\n\nOops ... parfor break ... do something here ...\n\n')
    disp(ME)
  end
  disp('Do something outside the parfor whether or not break occurred ...')
end
nkkqxpd9

nkkqxpd92#

恐怕你不能用break语句之类的语句来退出parfor循环,因为循环的执行顺序是完全任意的。
你有没有可能用spmd块来代替?用它们你可以让每个工作者知道一些条件是否被满足/违反,例如,这样就可以更好地控制程序的流程。这可能更多的是一个评论而不是一个回答,对不起;不过我觉得评论太长了。

rkkpypqq

rkkpypqq3#

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

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

另外,如果可能的话,使用简单的for循环,它更适合小程序,我通常使用parfor进行具有多层for循环和巨大处理的重型蒙特卡罗模拟。
你也可以在小块上运行parfor,然后把它放在while或另一个parfor循环中。

temp = 0
while (temp <= 100)
     parfor i=1:monte_temp 
           WHATEVER;
     end
     temp = temp + 1;
end

相关问题