Проблемы с распараллеливанием в MATLAB - PullRequest
4 голосов
/ 23 января 2012

Я не могу понять проблему в следующем коротком скрипте, который должен сравнивать вычисления с одним ЦП с распараллеливанием времени вычислений.

parfor Ссылка на полное изображение: ССЫЛКА

Код:

n = 700;
ranksSingle = zeros(1,n);
tic
for ind = 1:n
    ranksSingle(ind) = rank(magic(ind));
end
toc

matlabpool local 4
tic
ranks = zeros(1,n);
parfor (ind = 1:n)
    ranks(ind) = rank(magic(ind));
end
toc
isequal(ranksSingle, ranks)
matlabpool close

Я тоже попробовал с matlabpool 2. Как ясно видно из окна процесса, при выполнении параллельных вычислений все ядра заняты до 100% (отмечены красным).

При выполнении вычисления с одним процессором (отмечен синим цветом), как ни странно, 4 ядра также более загружены, чем раньше. Я бы ожидал, что только ОДНО ядро ​​будет расти. Я искал в интернете, чтобы увидеть, возможно ли функция magic() или rank встроена распараллелена, но, как вы можете прочитать здесь: http://www.walkingrandomly.com/?p=1894 это не так. Так что это нормально, что эти 4 ядра не полностью заняты, но все же мне интересно, почему ВСЕ ядра работают.

Во-вторых, мне действительно интересно время вычислений распараллеленной версии. Я знаю, что при распределении заданий по одноядерным процессам возникают некоторые накладные расходы, но это не должно быть настолько высоким, чтобы в итоге не было никакой выгоды: (

Возможно, кто-нибудь может сказать мне кое-что об этом :( Я действительно застрял в этом, так как я хочу ускорить некоторые из моих циклов for. Второй вопрос, есть ли какая-либо команда, чтобы всегда устанавливать размер рабочего к числу физических ядер у меня на компьютере? (а также с использованием Hyper Threading, если это дополнительное преимущество?)

Большое спасибо!

1 Ответ

5 голосов
/ 23 января 2012

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

Таким образом, ваш пример довольно плох для тестирования воздействия распараллеливания, потому что и magic, и rank слишком быстры.

    function testParfor2
    tic
    for i=1:4
        pause(1); %# wait for 1 second
    end
    toc
    matlabpool open 4
    tic
    parfor i=1:4
        pause(1); %# wait for 1 second
    end
    toc

Elapsed time is 4.050287 seconds.
Elapsed time is 1.534534 seconds.

Обратите внимание, что я запускаю секундуПараллельная работа в то же время, но примерно, результат должен быть воспроизводимым: есть некоторые накладные расходы (обратите внимание, что я не считал время, используемое matlabpool!), но ускорение есть.Вы должны увидеть такое же количество накладных расходов, если увеличите продолжительность паузы.Кроме того, вы должны тестировать с вашими реальными циклами (попробуйте распараллелить самый внешний цикл, кстати).

На ваш второй вопрос:

 matlabpool open

Создаст столько рабочих, сколько имеется физических ядер.Гиперпоточность поможет вам обеспечить работоспособность компьютера при выполнении параллельного задания.

Наконец, хотя magic и rank не могут быть полностью многопоточными сами по себе, они могут выполнять вызовы многопоточных подпрограмм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...