Почему я не могу получить выгоды от распараллеливания с большим количеством процессов?
У меня есть этот простой код, который просто вычисляет сумму матриц после некоторого умножения матриц
def serial_decohere(K, rho, n):
"""
:param K: List of bumpy matrices of size 2^n by 2^n
:param rho: A matrix of size 2^n by 2^n
:param n: Integer
:return: A matrix of size 2^n by 2^n
"""
out = np.zeros((pow(2, n), pow(2, n)), dtype=complex)
for i in range(len(K)):
out += np.dot(K[i], np.dot(rho, op.ctranspose(K[i])))
return out
Количество слагаемых в сумме растет экспоненциально с переменной n. Точнее говоря, длина списка K увеличивается как 3^n. Поэтому я решил распараллелить это. Используя joblib я пришел с этим
def decohere(K, rho, n):
"""
:param K: List of matrices of size 2^n by 2^n
:param rho: A matrix of size 2^n by 2^n
:param n: A positive integer
:return: A matrix of size 2^n by 2^n
"""
out = np.zeros((pow(2, n), pow(2, n)), dtype=complex)
def apply_kraus_op(kraus, rho_s):
"""
:param rho_s : Density matrix of system rho_s
:return: returns the density matrix
"""
nonlocal out
out += np.dot(kraus, np.dot(rho_s, op.ctranspose(kraus)))
Parallel(n_jobs=2)((delayed(apply_kraus_op))(K[i], rho) for i in range(len(K)))
return out
Тогда решил проверить это. Для n_jobs=1 и для матриц размером менее 32 на 32 я лучше с первой версией. Но быстро, время вычислений для второй версии растет медленнее, так что мне лучше со второй. Теперь, когда я увеличиваю до n_jobs=2, я всегда медленнее, чем первая версия. Так что мне хуже от распараллеливания цикла for. Зачем? Я мог бы попытаться написать код и использовать многопроцессорный модуль, но я предполагаю, что joblib потребовал гораздо больше времени и усилий и, по сути, делает это для распараллеливания цикла for.
1 ответ
В комментарии вы отметили, что "самый большой n
Я проверил это 7".
Данные, с которыми вы здесь работаете, крошечные. Даже с n=7
Ваша матрица имеет только 128x128 = 65536 элементов. Стоимость запуска нового процесса Python для параллельного выполнения работы значительна; при таком небольшом размере быстрее выполнить всю работу за один процесс.
Попробуйте еще раз с гораздо большей матрицей... скажем, n=12
,