Я не могу понять проблему в следующем коротком скрипте, который должен сравнивать вычисления с одним ЦП с распараллеливанием времени вычислений.
Ссылка на полное изображение: ССЫЛКА
Код:
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, если это дополнительное преимущество?)
Большое спасибо!