Узкое место в многопроцессорной обработке. Процесс (или ProcessPoolExecutor)? - PullRequest
0 голосов
/ 09 октября 2019

Я реализую код вычисления матрицы большого размера (2 ^ (10 ~) x 2 ^ (10 ~)) с помощью python. Чтобы сократить время выполнения, я применил многопроцессорную обработку, такую ​​как concurrent.futures.ProcessPoolExecutor и multiprocessing.Process.

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

Чтобы узнать причину, я проверил потребляемое время для каждой части и обнаружил, что при возвратерезультат каждого подпроцесса доминирует во времени выполнения.

Например, я создал 2 подпроцесса для матричного вычисления. В каждом подпроцессе требуется всего 0,5 ~ 0,6 секунды, но в основном процессе для получения результата после запуска каждого процесса требуется около 40 секунд.

Это сокращает время за счет применения многопроцессорной обработки. .Очередь. Когда я ранее использовал Queue, для сбора результата требуется больше времени.

Результат, созданный в каждом подпроцессе, представляет собой матрицу большого размера, равную 2 ^ 10 ~ x 2 ^ 10 ~.

Каков наилучший подход для ускорения части возврата данных в многопроцессорном коде?

...