Matlab 以编程方式确定是否在parfor与for循环内执行
在开发parfor循环时,通常最好从串行循环开始,使用小数据集进行测试,然后添加“par”若要扩展到大样本集等,当串行运行时,最好获取有关for循环每次迭代的诊断信息,但当使用parfor循环获取大数据集时,应关闭诊断信息 所以问题是:有没有任何方法可以通过编程来检测是在for循环中执行还是在parfor循环中执行?这种方式可能类似于Matlab 以编程方式确定是否在parfor与for循环内执行,matlab,parfor,Matlab,Parfor,在开发parfor循环时,通常最好从串行循环开始,使用小数据集进行测试,然后添加“par”若要扩展到大样本集等,当串行运行时,最好获取有关for循环每次迭代的诊断信息,但当使用parfor循环获取大数据集时,应关闭诊断信息 所以问题是:有没有任何方法可以通过编程来检测是在for循环中执行还是在parfor循环中执行?这种方式可能类似于if~isParfor;fprintf(…);结束是的,你可以!使用将告诉您是否正在对辅助进程执行操作。检查以下代码以获得简单的演示: clc clear all
if~isParfor;fprintf(…);结束
是的,你可以!使用将告诉您是否正在对辅助进程执行操作。检查以下代码以获得简单的演示:
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
因此,可以只检查“check”变量的第一个条目(即在任何一种情况下的第一次迭代中),并推断您是否(1)在parfor循环中。您可以使用未记录的命令
功能('isdmlworker')
来确定代码是否正在一个worker上运行。如果在worker上运行,则返回true
,否则返回false
。请注意,尽管此命令已存在很长时间,并且看起来很稳定,但它在理论上没有文档记录,并且可能会发生更改
或者,您可以使用文档化的usejava(“桌面”)
,如果您使用MATLAB桌面运行,则返回true
,否则返回false
(对于工作人员来说就是这样)。这是一个相当好的近似工作者,只要您有时不在没有桌面的情况下运行MATLAB本身(即,使用-nodesktop
选项启动它)
还要注意的是,如果您没有启动一个worker池,
parfor
在本地运行,就像一个for
循环一样,因此这两个循环都将返回false
——我想这可能是您想要的,但无论如何都值得注意。这非常适合在串行而非并行工作的通用函数中使用,像绘图和文字到语音。当分析功能无法运行时,它将优雅地保持惰性
function b = isParfor()
%returns 1 if in a parfor loop
b = ~isempty(getCurrentTask());
end