У меня есть сумма, которую я пытаюсь вычислить, и у меня возникают трудности с распараллеливанием кода. Расчет, который я пытаюсь распараллелить, является довольно сложным (он использует как массивы numpy, так и scipy разреженные матрицы). Он выплескивает массив numpy, и я хочу суммировать выходные массивы из примерно 1000 вычислений. В идеале я бы сохранил текущую сумму по всем итерациям. Однако я не смог понять, как это сделать.Как распараллелить вычисление суммы в python numpy?
До сих пор я пытался использовать функцию параллелизма joblib и функцию pool.map с пакетом многопроцессорности python. Для обоих из них я использую внутреннюю функцию, которая возвращает массив numpy. Эти функции возвращают список, который я конвертирую в массив numpy и затем суммирую.
Однако, после того, как функция joblib завершила все итерации, основная программа никогда не запускается (похоже, что исходное задание находится в состоянии ожидания, используя 0% CPU). Когда я использую pool.map, я получаю ошибки памяти после завершения всех итераций.
Есть ли способ просто распараллеливать текущую сумму массивов?
Редактировать: Цель состоит в том, чтобы сделать что-то вроде следующего, за исключением параллелизма.
def summers(num_iters):
sumArr = np.zeros((1,512*512)) #initialize sum
for index in range(num_iters):
sumArr = sumArr + computation(index) #computation returns a 1 x 512^2 numpy array
return sumArr
Вы должны попытаться опубликовать минимальный примерный код. Вы пытаетесь выполнить свертку? – Simon
Нет, я не делаю свертку. Я вращаю изображение около 1000 раз, и мне нужно суммировать результат с каждого поворота. Для pool.map я просто использую 'outputArr = np.array (pool.map (parloop, range (num_views)))' where 'parloop' возвращает массив numpy. – Kevin
Может быть, это уже параллель? «поскольку numpy знает, что вы хотите сделать продукт с матричной точкой, он может использовать оптимизированную реализацию, полученную как часть« BLAS »(подпрограммы базовой линейной алгебры). ... у многих архитектур теперь есть BLAS, который также использует многоядерную машину Если ваш numpy/scipy скомпилирован с использованием одного из них, то точка() будет вычисляться параллельно (если это будет быстрее) **, если вы ничего не сделаете **. " www.scipy.org/ParallelProgramming – endolith