Узкое место в многопроцессорной обработке в PythonPython

Программы на Python
Anonymous
Узкое место в многопроцессорной обработке в Python

Сообщение Anonymous »

У меня есть код, который использует два параметра (r,t) для создания матрицы H. Затем я нахожу собственные значения этой матрицы и выполняю некоторые вычисления с использованием собственных значений. Теперь мне нужно сделать это для множества разных значений (r, t) (около 200). Поскольку каждая операция независима, я попытался использовать многопроцессорность в Python, чтобы все эти операции выполнялись одновременно.
Когда я запускаю код для одного (r,t), это занимает около 1,5 часов. . У меня сложилось впечатление, что запуск его в течение 200 (r,t) с должен занять примерно то же время при использовании многопроцессорной обработки. Однако, похоже, это займет значительно больше времени. У меня уже второй день работы кода. Я использую высокопроизводительный блок моего университета, поэтому считаю, что ядер для назначения должно быть достаточно. Мой код выглядит примерно так:

Код: Выделить всё

import numpy as np
import multiprocessing

rs = np.linspace(0.5,1.5,20)
thetas = np.linspace(0,np.pi/2,10)

def matrix_stuff(r,t):
#constructs a matrix H(r,t). Diagonalize and do stuff.

processes = []
rets = []
q = multiprocessing.Queue()

for i in range(len(thetas)):
for j in range(len(rs)):
theta = thetas[i]
r = rs[I]
p = multiprocessing.Process(target=matrix_stuff, args = (r,theta,i,j))
processes.append(p)
p.start()

for p in processes:
ret = q.get()
rets.append(ret)

for p in processes:
p.join()

#store output in deltas

deltas = np.zeros((len(rs),len(thetas)))

for ret in rets:
# ret has format (value, i,j)
deltas[rets[1],rets[2]] = rets[0]

np.savetxt('new_deltas.txt',deltas)
Мой вопрос: есть ли еще какие-то области, в которых моя программа может оказаться узким местом, но которые я не рассматриваю? Я впервые использую многопроцессорную обработку, поэтому мне все еще не совсем понятны детали.
Изменить: я создал несколько тестовых сценариев, чтобы проверить, сколько времени занимают различные процессы. В то время как для общего теста, где параллельным процессом является просто time.sleep(10), распараллеливание, похоже, работает так, как задумано. Однако при использовании следующего тестового кода

Код: Выделить всё

import multiprocessing as mp
import time
import numpy as np

def foo():
X = np.random.rand(2000,2000)
eigs = np.linalg.eigvals(X)
return eigs

def foo_q(q):
X = np.random.rand(2000,2000)
eigs = np.linalg.eigvals(X)
q.put(eigs)

start_lin = time.time()
for _ in range(5):
val = foo()
end_lin = time.time()

print('Time taken for linear process : ',(end_lin - start_lin))

q = mp.Queue()
processes = []

start_par = time.time()

for _ in range(5):
p = mp.Process(target = foo_q, args = (q,))
processes.append(p)
p.start()

for p in processes:
ret = q.get()

for p in processes:
p.join()

end_par = time.time()

print('Time taken for parallel process : ',(end_par - start_par))
Я получаю-
Время, затраченное на линейный процесс: 15,935563564300537
Время, затраченное на параллельный процесс: 16,6868999004364
Что здесь происходит?
Кроме того, для справки: при запуске функции mp.cpu_count() кажется, что у меня доступно 192 ядра.< /п>

Подробнее здесь: https://stackoverflow.com/questions/786 ... -in-python

Вернуться в «Python»