2014-10-22 1 views
4

При разработке партурных циклов, как правило, лучше всего начинать в последовательном цикле, чтобы протестировать с небольшим набором данных, а затем добавить «par» для масштабирования в большой набор образцов и т. Д. Когда работая последовательно, полезно получить диагностическую информацию о каждой итерации цикла for, однако при использовании парфорирования для огромного набора данных диагностическая информация должна быть отключена.Программно определить, выполняется ли внутри parfor vs. for loop

Итак, вопрос: есть ли какой-либо способ программно определить, выполняется ли в цикле for против цикла parfor? Этот способ мог бы так что-то вроде if ~isParfor; fprintf(...); end

ответ

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 

Поэтому можно было бы проверить только первое вхождение «Check» переменной (т.е. на первой итерации в любой case) и выведите, являетесь ли вы (1) или нет (0) в парфоре.

2

Вы можете использовать недокументированную команду feature('isdmlworker'), чтобы определить, выполняется ли код на рабочем столе. Он возвращает true, если работает на рабочем месте и false в противном случае. Обратите внимание, что хотя эта команда существует долгое время и выглядит стабильной, она теоретически недокументирована и может быть изменена.

В качестве альтернативы вы можете использовать документированный usejava('desktop'), который возвращает true, если вы работаете с рабочим столом MATLAB и false в противном случае (что имеет место для работника). Это довольно хорошее приближение к тому, чтобы быть рабочим, если вы также не запускаете сам MATLAB без рабочего стола (то есть запустите его с помощью опции -nodesktop).

Заметим также, что если вы не пускаете пул рабочих, parfor выполняется локально так же, как for цикла, поэтому оба они вернутся false - Я предполагаю, что это, вероятно, будет то, что вы хотите, но стоит отметить, в любом случае.

-1

Это замечательно использовать внутри универсальной функции, которая работает последовательно, но не параллельна, как построение графика и текст в речь. Функция анализа будет изящно оставаться инертной, когда она не сможет работать.

function b = isParfor() 
    %returns 1 if in a parfor loop 
    b = ~isempty(getCurrentTask()); 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^