Как узнать, сколько итераций осталось в цикле parfor в Matlab? - PullRequest
5 голосов
/ 09 августа 2011

Я запускаю цикл Parfor в Matlab, который занимает много времени, и я хотел бы знать, сколько осталось итераций. Как я могу получить эту информацию?

Ответы [ 6 ]

5 голосов
/ 09 августа 2011

Я не верю, что вы можете получить эту информацию непосредственно из 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'));
2 голосов
/ 19 ноября 2014

Попробуйте этот FEX-файл: http://www.mathworks.com/matlabcentral/fileexchange/32101-progress-monitor--progress-bar--that-works-with-parfor

Вы можете легко изменить его, чтобы он возвращал номер итерации вместо отображения индикатора выполнения.

1 голос
/ 09 декабря 2014

Можно сделать что-то похожее на индикатор выполнения, похожий на этот ...

До цикла parfor:

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

А во время цикла:

fprintf('\b|\n');

Здесь мы имеем m - общее количество итераций, . - общее количество итераций, а | - количество выполненных итераций. \n обеспечивает печать символов в цикле parfor.

0 голосов
/ 15 августа 2018

В Matlab 2017a или более поздней версии вы можете использовать очередь данных или очередь данных для опроса для достижения этой цели. Вот пример документации 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

0 голосов
/ 10 декабря 2014
0 голосов
/ 09 августа 2011

Если вы просто хотите узнать, сколько примерно осталось времени, вы можете запустить программу, записав максимальное время, а затем сделать это

tStart = tic;
parfor i=1:n
  tElapsed = toc(tStart;)
  disp(['Time left in min ~ ', num2str( ( tMax - tElapsed ) / 60 ) ]);
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...