当我安装了并行计算工具箱并在我的代码中使用parfor时,MATLAB一旦到达parfor循环,就会自动启动池。然而,这使得有时很难调试,这就是为什么我想阻止MATLAB在某些情况下打开一个池。那么,我怎样才能告诉MATLAB不要打开游泳池呢?显然,我可以遍历我的代码,删除所有的parfor循环并用普通的for循环替换它们,但是这很繁琐,我可能会忘记撤销我的更改。
编辑:指定,理想情况下,当设置控件或变量时,我希望parfor循环的行为与for完全一样。也就是说,例如,我也应该能够在for -循环中放置断点.
发布于 2015-08-18 13:18:28
在Home->并行->并行首选项下,您可以取消选中复选框“在执行并行关键字时自动创建并行池(如果不存在的话)”。这使得所有的parfor循环都像普通的for循环一样运行。
如果我想出了在代码中这样做的方法,而不是使用复选框,我会再联系您的。
更新发现确实可以通过代码更改设置,尽管我不建议这样做,因为它涉及更改的首选项文件。这是来自无文件的MATLAB博客的Yair。
ps = parallel.Settings;
ps.Pool
ans =
PoolSettings with properties:
AutoCreate: 1
RestartOnClusterChange: 1
RestartOnPreferredNumWorkersChange: 1
IdleTimeout: 30
PreferredNumWorkers: 12您需要将AutoCreate开关更改为0。
作为替代,我建议将parfor中的所有内容都封装在一个函数中,从而调用
parfor 1:N
output = function(..)
end现在修改脚本/函数,使其顶部有一个Parallel开关:
if Parallel
parfor 1:N
output = function(..)
end
else
for 1:N
output = function(..)
end
end您可以编辑和调试function本身,并在程序顶部设置开关以并行或串行方式执行。
发布于 2014-08-11 12:58:38
以及正常的语法
parfor i = 1:10您也可以使用
parfor (i = 1:10, N)其中,N是循环中要使用的最大工人数。N可以是代码的其他部分设置的变量,因此您可以通过将变量N设置为1或0来有效地打开和关闭并行性。
编辑:要清楚的是,这只控制执行代码的工作人员的数量(如果N为零,那么池是否已经启动)。如果不存在池,则代码将在客户端上执行。尽管如此,代码仍然是一个parfor循环, not 具有与for循环相同的语义--对parfor循环的循环代码有一些限制,而对于for循环则不存在这些限制,并且不能保证循环迭代的执行顺序。
当您使用parfor时,您所做的不仅仅是说“请加快速度”。您对MATLAB说:“我可以向您保证这个循环的迭代是独立的,并且可以按任何顺序执行,所以如果您试图并行化它,您就可以了”。因为您已经保证了这一点,所以MATLAB能够通过使用与for循环不同的语义来加快速度。
完全获得for循环行为的唯一方法是使用for,如果您需要为调试目的来回切换,则需要注释和取消对for/parfor的注释(或者可能使用if/else块,根据某些变量在for和parfor之间切换)。
发布于 2014-08-11 08:16:53
我认为这里的方法不是禁用parfor,而是让它表现得像一个简单的for。
通过将工人人数设置为1,这应该是可能的。
parpool(1)根据代码的不同,您可以在运行代码之前只执行一次此操作,或者在每次设置代码中任何位置的工作人员数量时都需要(有条件地)这样做。
https://stackoverflow.com/questions/25238583
复制相似问题