2016-05-18 5 views
0

У меня есть основной цикл, который содержит парфорную петлю.Использование парфора эффективно

Я хочу убедиться в том, что мне нравится использовать парфор.

Ниже объясняется концептуально, что я делаю:

% parameters 
    iterate = [1e0 1e2 1e3 1e4 1e5]; 

    % main loop 
    for k=1:5 

     % parfor 
     parfor j=1:iterate(k) 
      *calculations* 
      m(j)= *calculations* 
     end 

    %using the result of parfor in the main loop 
    vector(k)= m/iterate(k); 

    end 

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

Будет ли эта компоновка производить результаты быстрее?

+1

Как долго «что угодно»? – Suever

+0

Я изо всех сил пытаюсь понять ваш пример кода. 'act (main)' является скаляром, а 'make_smth/2' является вектором. – Daniel

+0

@Suever требуется очень много времени, часов, недель .. в зависимости от количества итераций – HappyBee

ответ

1

Я бы предположил, что ваш внешний цикл должен быть parfor, чтобы каждый работник имел относительно долгую работу, и вы тратите меньше времени на ожидание завершения работы других работников.

Имея это внутри, вы должны ждать, пока все работники будут заканчивать каждый раз через петлю.

for main = 1:N 

    doing_smth = zeros(N1,1); 

    parfor pal = 1:2N 
     %// This task may not be very long-running 
     doing_smth(pal) = whatever; 
    end 

    %// Have to wait for all runners to complete before we can continue 
    %// Obviously we have to do this waiting N times (each time through the loop) 
    act(main)= doing_smth/2 
end 

Если переместить ее к внешней петле, то задание будет отправлено на рабочий будет выполняться дольше (более эффективным за счет снижения трафика назад и вперед с работником), и вы не ждали все работники заканчивают в течение петли.

parfor main = 1:N 

    doing_smth = zeros(N1, 1); 

    for pal = 1:2N 
     doing_smth(pal) = whatever; 
    end 

    %// No waiting anymore! 
    act(main) = doing_smth/2; 
end 

%// Now wait here for all workers to finish 

Update

На основе обновления вы предоставили в свой код, я на самом деле думаю, что было бы лучше иметь parfor на внутреннем цикле, предполагая, что этот расчет внутри этого цикла происходит достаточно длинный. Это позволит лучше использовать рабочих, потому что, если у вас есть внешний цикл, это parfor, так как у вас всего 4 рабочих и 5 итераций внешней петли, тогда это займет 2x больше, чем если бы у вас было 5 рабочих, потому что 4 рабочих закончили 4 из итераций, а затем 3 работника будут сидеть без дела, а 1 рабочий завершает пятую итерацию. Используя внутреннюю часть parfor, вы будете полностью использовать всех работников. Вы do хотите быть уверены, что внутри этого внутреннего цикла требуется достаточное количество времени, чтобы уменьшить накладные расходы на связь. В противном случае вы захотите вручную вырезать свои данные в блоки и обработать их в пределах parfor.

+0

, что, если внешний цикл имеет гораздо меньше итераций, чем внутренний цикл. Использует ли parfor во внешнем цикле еще более высокую общую производительность? – HappyBee

+0

Это зависит от количества итераций и количества рабочих. Пока есть больше рабочих, чем итераций – Suever

+0

У меня есть i7, я получаю 4 рабочих @Suever – HappyBee

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