【问题标题】:How do I know how many iterations are left in a parfor loop in Matlab?我怎么知道在 Matlab 的 parfor 循环中剩下多少次迭代?
【发布时间】:2011-10-22 18:40:28
【问题描述】:

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

【问题讨论】:

  • 您可以创建 N 个名为 'iter_1'、'iter_2' 等的空文本文件,并在每次 parfor 迭代结束时删除相应的文件。然后你需要做的就是计算目录中的文件数。
  • @Jonas,真恶心。它也可以工作!谢谢!我很惊讶 MATLAB 还没有添加一些东西来让这更容易。

标签: matlab for-loop parallel-processing


【解决方案1】:

使用 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

最终结果:

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      进度条之类的东西可以用类似的方式完成......

      parfor 循环之前:

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

      在循环中:

      fprintf('\b|\n');
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          如果你只是想知道大约还剩多少时间,你可以运行程序一次记录最大时间,然后这样做

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

          【讨论】:

            【解决方案6】:

            我不相信您可以直接从 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'));
            

            【讨论】:

              猜你喜欢
              • 2020-02-16
              • 1970-01-01
              • 1970-01-01
              • 2014-12-07
              • 2020-12-08
              • 2015-05-19
              • 1970-01-01
              • 2014-10-11
              • 1970-01-01
              相关资源
              最近更新 更多