当我安装并行计算工具箱并在我的代码中使用parfor
时,MATLAB会在到达parfor
循环后自动启动池。然而,这有时难以调试,这就是为什么我想阻止MATLAB在某些情况下打开池。那么,我怎么能告诉MATLAB不要打开池?显然,我可以浏览我的代码并删除所有parfor
循环,并用普通的for
循环替换它们,但这很乏味,我可能会忘记撤消我的更改。
编辑要指定,我理想地希望parfor循环在设置控件或变量或其他东西时的行为与for完全相同。也就是说,我应该能够在for循环中放置断点。
答案 0 :(得分:7)
在Home-> parallel-> parallel偏好设置下,您可以取消选中复选框"当执行并行关键字时,自动创建并行池(如果一个并不存在)。"这使得所有parfor
循环都表现为普通for
循环。
如果我在代码中找到一种方法,而不是使用复选框,我会回复你。
更新结果确实可以通过代码更改设置,但我不建议这样做,因为它涉及更改MATLAB的首选项文件。这取自Yair Altman的Undocumented MATLAB blog。
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
本身,并将您的开关设置在程序之上,以便并行或串行执行。
答案 1 :(得分:5)
以及正常的语法
parfor i = 1:10
您也可以使用
parfor (i = 1:10, N)
其中N
是循环中使用的最大worker数。 N
可以是代码其他部分设置的变量,因此您可以通过将变量N
设置为1或0来有效地打开和关闭并行性。
编辑:要清楚,这只能控制执行代码的工作者数量(如果N为零,则表示池是否完全启动)。如果不存在池,则代码将在客户端上执行。然而,代码仍然是parfor
循环,不具有与for
循环相同的语义 - parfor
循环的循环代码存在限制for
循环不存在,并且无法保证循环迭代的执行顺序。
当您使用parfor
时,您所做的不仅仅是说"请加快速度"。您对MATLAB"我可以向您保证,此循环的迭代是独立的,并且可以按任何顺序执行,因此如果您尝试将其并行化,那么您就可以了。因为您已经保证,MATLAB能够通过使用与for
循环不同的语义来加快速度。
完全获得for
循环行为的唯一方法是使用for
,如果您需要来回切换以进行调试,则需要对{{进行评论和取消注释1}} / for
(或者使用parfor
/ if
块,根据某个变量在else
和for
之间切换。
答案 2 :(得分:2)
我认为去这里的方法不是禁用parfor
,而是让它表现得像一个简单的for
。
这应该可以通过将工人数量设置为1来实现。
parpool(1)
根据您的代码,您可以在运行代码之前执行此操作一次,或者每次在代码中的任何位置设置工作器数时,您可能需要(有条件地)执行此操作。