Запуск функции параллельно на всех процессорах ПК — Python

#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. Обычно это предполагает, что совместное использование данных между процессами приводит к большим затратам, чем позволяет распараллеливание.