Почему нет никакого влияния после использования более 2 процессов в пуле?



Используя функцию map в библиотеке multiprocessing, я не вижу разницы во времени выполнения при использовании более 2 процессов. Я запускаю программу, используя 4 ядра.



Фактический код довольно прямолинеен и вычисляет первые 4000 чисел Фибоначчи 4 раза (=Количество ядер). Он распределяет работу равномерно между N ядрами (например, при использовании пула с 2 процессами каждый процесс будет вычислять первые 4000 чисел Фибоначчи дважды). Весь этот процесс завершен для N = 1 вплоть до количества ядер.

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




  1. 3,147

  2. 1,72

  3. 1,896

  4. 1.899


Кто-нибудь знает, почему не происходит уменьшения времени выполнения при использовании более 2 ядер? Фактический код:



import multiprocessing
from time import time


def F(_):
for n in range(4 * 10 ** 3):
a, b = 0, 1
for i in range(0, n):
a, b = b, a + b
return


def pool_fib():
n_cores = multiprocessing.cpu_count()
args = list(range(multiprocessing.cpu_count()))
for i in range(1, n_cores + 1):
with multiprocessing.Pool(i) as p:
start = time()
p.map(F, args)
print(i, time() - start)


if __name__ == '__main__':
pool_fib()
461   1  

1 ответ:

При условии, что вы используете достаточно современный процессор (например, любой процессор Intel Core), multiprocessing.cpu_count() не даст вам количество физических ядер вашей машины, но количество гиперпотоков. В двух словах, гиперпоточность позволяет одному физическому ядру иметь n (чаще всего, два) конвейера, что заставляет вашу ОС думать, что у вас есть n в разы больше ядер, чем у вас есть на самом деле. Это полезно, когда вы делаете некоторые вещи, которые могут голодать ядро с данными (в частности, IO или RAM поисковые запросы, вызванные пропусками кэша), но ваша рабочая нагрузка является чисто арифметической, и она вряд ли заставит ваш процессор голодать, что приведет к незначительному или нулевому выигрышу от гиперпотоков. И небольшие выгоды, которые вы можете получить, будут затмеваться накладными расходами на многопроцессорную обработку, что весьма существенно.

P.S.

Обычно я публикую такие вещи в комментариях, но я превысил ограничение на размер комментария. Кстати, если вы выбрали ряд Фибоначчи для чего-то большего, чем просто пример, то вы возможно, стоит рассмотреть более быстрый алгоритм: быстрое вычисление Фибоначчи

Comments

    Ничего не найдено.