Параллельная IPython и производительность карты
Я использовал параллельные вычисления раньше через MPI (и Fortran:)). Я хотел бы использовать параллельные возможности IPython.
Мой вопрос связан с низкой производительностью следующего кода, вдохновленного http://ipython.org/ipython-doc/dev/parallel/asyncresult.html:
from IPython.parallel import Client
import numpy as np
_procs = Client()
print 'engines #', len(_procs)
dv = _procs.direct_view()
X = np.linspace(0,100)
add = lambda a,b: a+b
sq = lambda x: x*x
%timeit reduce(add, map(sq, X))
%timeit reduce(add, dv.map(sq, X))
Результаты для одного процессора:
10000 loops, best of 3: 43 µs per loop
100 loops, best of 3: 4.77 ms per loop
Не могли бы вы сказать мне, если результаты кажутся вам нормальными, и если да, то почему такая огромная разница во времени вычислений?
С наилучшими пожеланиями, Flavien.
1 ответ
Параллельная обработка не приходит бесплатно. Существует стоимость, связанная с отправкой элементов задания клиентам и последующим получением результатов, которая называется накладными расходами. Ваша оригинальная работа занимает 43 мкс, и это слишком мало. Чтобы параллельная обработка стала полезной, вам нужно иметь значительно больше рабочих элементов. Простое эмпирическое правило заключается в том, что для обработки его рабочих элементов каждому работнику требуется не менее чем в 10 раз больше накладных расходов. Попробуйте использовать вектор из 1 миллиона элементов или даже больше.