开发parfor循环时,通常最好从串行循环开始,用小数据集进行测试,然后添加" par"当连续运行时,很容易得到关于for循环的每次迭代的诊断信息,但是当使用parfor循环来处理大数据集时,应该关闭诊断信息。
所以问题是:有没有办法以编程方式检测是否在for循环和parfor循环中执行?这种方式可能类似于if ~isParfor; fprintf(...); end
答案 0 :(得分:2)
是的,你可以!使用getCurrentTask告诉您是否正在对工作人员执行正在执行的操作。请查看此代码以进行简单演示:
clc
clear all
A1 = zeros(10,10);
A2 = zeros(10,10);
Check1 = zeros(1,10);
Check2 = zeros(1,10);
parfor ix = 1:10
Check1(ix) = ~isempty(getCurrentTask());
myTemp = zeros(1,10);
for jx = 1:10
myTemp(jx) = ix + jx;
end
A1(ix,:) = myTemp;
end
clear myTemp
for ix = 1:10
Check2(ix) = ~isempty(getCurrentTask());
myTemp = zeros(1,10);
for jx = 1:10
myTemp(jx) = ix + jx;
end
A2(ix,:) = myTemp;
end
Check1
Check2
输出:
Check1 =
1 1 1 1 1 1 1 1 1 1
Check2 =
0 0 0 0 0 0 0 0 0 0
因此,只能检查'检查'的第一个条目。变量(即在任何一种情况下的第一次迭代)并推导出你是(1)还是不是(0)在parfor循环中。
答案 1 :(得分:2)
您可以使用未记录的命令feature('isdmlworker')
来确定是否正在对worker执行代码。如果在worker上运行,则返回true
,否则返回false
。请注意,尽管此命令已存在很长时间并且看起来很稳定,但理论上它没有文档记录,可能会发生变化。
或者您可以使用记录的usejava('desktop')
,如果您使用的是MATLAB桌面,则返回true
,否则返回false
(工作人员就是这种情况)。这是一个很好的近似工作,只要你有时没有桌面运行MATLAB本身(即用-nodesktop
选项启动它)。
另请注意,如果您没有启动工作池,parfor
就像for
循环一样在本地运行,因此这两个都将返回false
- 我猜这个很可能是你想要的,但无论如何都值得注意。
答案 2 :(得分:-1)
这非常适合在一个通用函数中使用,该函数在串行但不是并行的情况下工作,如绘图和文本到语音。当分析功能无法运行时,它将优雅地保持惰性。
function b = isParfor()
%returns 1 if in a parfor loop
b = ~isempty(getCurrentTask());
end