Когда я запускаю код для одного (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