我怎么知道Matlab中parfor循环中剩下多少次迭代?

时间:2011-08-08 21:57:33

标签: matlab for-loop parallel-processing

我在Matlab中运行一个parfor循环需要花费很多时间,我想知道剩下多少次迭代。我怎样才能获得这些信息?

6 个答案:

答案 0 :(得分:5)

我不相信你可以直接从MATLAB获取这些信息,除了每次迭代打印一些东西并手工计算这些行。

要了解原因,请记住每个parfor迭代在其自己的工作空间中执行:虽然在循环内递增计数器是合法的,但访问其“当前”值不是(因为此值在完成之前不存在的循环)。此外,parfor构造不保证任何特定的执行顺序,因此打印迭代器值没有帮助。

cnt = 0;
parfor i=1:n
    cnt = cnt + 1; % legal
    disp(cnt); % illegal
    disp(i); % legal ofc. but out of order
end

也许有人确实有一个聪明的解决方法,但我认为parfor迭代的独立性质掩盖了可靠的计数。上述限制以及使用evalin等的限制支持了这一结论。

正如@Jonas建议的那样,你可以通过在MATLAB之外发生的副作用获得迭代计数,例如:在某个目录中创建空文件并对其进行计数。你可以在MATLAB中做到这一点:

fid = fopen(['countingDir/f' num2str(i)],'w');
fclose(fid);
length(dir('countingDir'));

答案 1 :(得分:2)

试试这个FEX文件:http://www.mathworks.com/matlabcentral/fileexchange/32101-progress-monitor--progress-bar--that-works-with-parfor

您可以轻松修改它以返回迭代编号,而不是显示进度条。

答案 2 :(得分:1)

像进度条这样的东西可以像这样做......

parfor循环之前:

fprintf('Progress:\n');
fprintf(['\n' repmat('.',1,m) '\n\n']);

在循环中:

fprintf('\b|\n');

这里我们有m是迭代总数,.显示迭代总数,|显示迭代完成次数。 \n确保字符在parfor循环中打印。

答案 3 :(得分:0)

如果您只是想知道大约剩下多少时间,您可以在记录最长时间后运行程序,然后执行此操作

tStart = tic;
parfor i=1:n
  tElapsed = toc(tStart;)
  disp(['Time left in min ~ ', num2str( ( tMax - tElapsed ) / 60 ) ]);
  ...
end

答案 4 :(得分:0)

我创建了一个实用程序来执行此操作:

http://www.mathworks.com/matlabcentral/fileexchange/48705-drdan14-parforprogress

答案 5 :(得分:0)

在Matlab 2017a或更高版本中,您可以使用data queuepollable data queue来实现。这是MathWorks文档的示例,该示例从第一个链接开始如何制作进度条:

function a = parforWaitbar

D = parallel.pool.DataQueue;
h = waitbar(0, 'Please wait ...');
afterEach(D, @nUpdateWaitbar);

N = 200;
p = 1;

parfor i = 1:N
    a(i) = max(abs(eig(rand(400))));
    send(D, i);
end

    function nUpdateWaitbar(~)
        waitbar(p/N, h);
        p = p + 1;
    end
end

最终结果:

A picture of the resulting wait bar