#python #multiprocessing #ray #dft #mpmath
Вопрос:
Я пытаюсь создать матрицу NxN DFT с помощью библиотеки mpmath. Поскольку мне приходится создавать очень большие матрицы (например, 10000×10000), это занимает много времени — около 24 минут для матрицы 10000×10000 со следующим кодом:
timerr1 = np.empty([10])
N = np.linspace(1000,10000,10)
for j in range(10):
x_r= 10*np.random.rand(int(N[j]))
x_i = 10*np.random.rand(int(N[j]))
x = numpy.vectorize(complex)(x_r, x_i)
x_mpc = numpy.vectorize(mp.mpc)(x)
print(j)
M = np.empty([int(N[j]),int(N[j])],dtype = mp.mpc)
val = mp.exp( mp.mpc(-2j) * mp.pi / mp.mpf(N[j]))
start_time1 = time.time()
M[0,:] = mp.mpc(1)
for c in range(0,int(N[j])):
M[1,c] = mp.power(val,c)
for r in range(2,int(N[j])):
M[r,:] = np.multiply(M[r-1,:], M[1,:])
timerr1[j] = time.time() - start_time1
Я хотел бы воспользоваться возможностями обработки моего сервера (28 логических процессоров), чтобы создать эту матрицу намного быстрее.
Я попытался использовать «многопроцессорную» библиотеку таким образом:
многопроцессорная обработка:
from mpmath import mp
import numpy as np
import time
from multiprocessing import Pool
def f(x):
for r in range (2,N):
x = np.append(x,np.multiply(x[r-1], x[1]))
return x
N = 500
M = np.empty([N,N],dtype = mp.mpc)
val = mp.exp( mp.mpc(-2j) * np.pi / mp.mpf(N))
M[0,:] = mp.mpc(1)
for c in range(0,N):
#M[1,c] = mp.power(val,c)
M[1,c] = np.power(val,c)
myList = []
for j in range(N):
myList.append(M[0:2,j])
inputs = myList
print('strating parallel')
start_time2 = time.time()
if __name__ == '__main__':
agents = 28
with Pool(processes=agents) as pool:
result = pool.map(f, inputs)
timer2 = time.time() - start_time2
и с этой версией:
if __name__ == '__main__':
p = Pool()
result = p.map(f, inputs)
p.close()
p.join()
кроме того, я попытался использовать «луч»:
ray.init()
print('parallel in process ...')
futures = [f.remote(M[0:2,i]) for i in range(N)]
res = ray.get(futures)
ray.shutdown()
В обоих случаях я вижу, что загрузка процессора достигла 100%:
К сожалению, при параллельной реализации я получаю больше времени, чем при последовательной реализации. Кто-нибудь сталкивался с этим явлением и знает, что я могу сделать, чтобы успешно создать большую матрицу DFT за более короткое время?
Большое спасибо!
Комментарии:
1. Обычно это предполагает, что совместное использование данных между процессами приводит к большим затратам, чем позволяет распараллеливание.