以编程方式确定是否在parfor内部执行for for循环

时间:2014-10-22 13:41:34

标签: matlab parfor

开发parfor循环时,通常最好从串行循环开始,用小数据集进行测试,然后添加" par"当连续运行时,很容易得到关于for循环的每次迭代的诊断信息,但是当使用parfor循环来处理大数据集时,应该关闭诊断信息。

所以问题是:有没有办法以编程方式检测是否在for循环和parfor循环中执行?这种方式可能类似于if ~isParfor; fprintf(...); end

3 个答案:

答案 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