Параллельная 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 миллиона элементов или даже больше.

Другие вопросы по тегам