2016-09-19 5 views
2

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

parfor k = 1:N 
    a = rand(5000); 
    b = inv(a); 
end 

vs.

for k = 1:N 
    a = rand(5000); 
    F(k) = parfeval(p,'inv',1,a); 
end 
for k = 1:N 
    [completedIdx,value] = fetchNext(F); 
    fprintf(1,'%d ',completedIdx); 
end 

parfor последовательно быстрее. Есть ли какие-либо сведения о том, почему это так? Мое упрощенное понимание - parfor, по существу, запускает каждый цикл как параллельное задание.

+0

Соответствующее чтение: http://stackoverflow.com/questions/32146555/saving-time-and-memory-using-parfor-in-matlab/32146700#32146700 Операция 'inv' действительно неявно многопоточна, поэтому использование' parfor', что не ускоряет его (см. сообщение, которое я связал). – Adriaan

+0

Отличный смысл. Я смотрел, но не нашел inv среди многопоточных функций, но я вам доверяю. Тем не менее, я не уверен, объясняет ли это более медленный parfeval по сравнению с parfor. –

ответ

2

Ваше понимание неверное.

Запустив петлю с помощью parfeval, вы не получите преимущество от возможностей панели инструментов параллельных вычислений.

В первом случае инверсия матрицы 5000 x 5000 показала бы, что она будет интенсивно вычислить, однако MATLAB оптимизирован для этих типов операций (в частности, операций с матрицами).

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

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

Я бы рискнул, что только в тех случаях, когда size(a) >> N вы увидите случай, когда parfor превзошел parfeval.

Редактировать @Adriaan производит a great point. inv также является неявно распараллеленной функцией, как и большинство функций MATLAB.

+0

. Я думаю, что я не совсем понимаю ваш ответ: «Использование parfeval в вашем втором примере использования означает, что вы последовательно оцениваете инверсию каждой матрицы (даже если вы распараллеливают обратную функцию) « Я думал, что распараллеливаю, вызывая parfeval, как он все еще не распараллелен? –

+0

Я бы не сказал, что * большинство функций MATLAB * распараллеливаются; Я бы сказал, что большинство функций, которые не показывают код при попытке 'edit ', являются прекомпилированными функциями (в C++ afaik), и они оптимизированы с точки зрения скорости уже. Полный список неявно многопоточных функций можно найти здесь [http://nl.mathworks.com/products/parallel-computing/parallel-support.html;jsessionid=c9625ed2c7026e49e0e6921b2e5d) – Adriaan

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