Многопроцессорность Python в mpi

У меня есть сценарий Python, который я написал с использованием многопроцессорного модуля, для более быстрого выполнения. Вычисление смущает параллельно, поэтому эффективность зависит от количества процессоров. Теперь я хотел бы использовать это в программе MPI, которая управляет вычислением MCMC на нескольких компьютерах. Этот код имеет вызов system (), который вызывает скрипт python. Тем не менее, я обнаружил, что когда он называется так, выигрыш в эффективности от использования многопроцессорной обработки Python исчезает.

Как я могу заставить свой скрипт на Python сохранять прирост скорости от многопроцессорной обработки при вызове из MPI?

Вот простой пример, который аналогичен гораздо более сложным кодам, которые я хочу использовать, но показывает то же общее поведение. Я пишу исполняемый скрипт на языке Python с именем junk.py.

#!/usr/bin/python
import multiprocessing
import numpy as np

nproc = 3
nlen = 100000


def f(x):
    print x
    v = np.arange(nlen)
    result = 0.
    for i, y in enumerate(v):
        result += (x+v[i:]).sum()
    return result


def foo():
    pool = multiprocessing.Pool(processes=nproc)
    xlist = range(2,2+nproc)
    print xlist
    result = pool.map(f, xlist)
    print result

if __name__ == '__main__':
    foo()

Когда я запускаю это из оболочки самостоятельно, используя «top», я вижу три процесса python, каждый из которых занимает 100% процессорного времени на моей 16-ядерной машине.

node094:mpi[ 206 ] /usr/bin/time junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
62.68user 0.04system 0:21.11elapsed 297%CPU (0avgtext+0avgdata 16516maxresident)k
0inputs+0outputs (0major+11092minor)pagefaults 0swaps

Однако, если я вызову это с помощью mpirun, каждый процесс python отнимает 33% процессорного времени, и в целом для его выполнения требуется примерно в три раза больше времени. Вызов с -np 2 или более приводит к большему количеству процессов, но не ускоряет вычисления.

node094:mpi[ 208 ] /usr/bin/time mpirun -np 1 junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
61.63user 0.07system 1:01.91elapsed 99%CPU (0avgtext+0avgdata 16520maxresident)k
0inputs+8outputs (0major+13715minor)pagefaults 0swaps

(Дополнительные примечания: Это mpirun 1.8.1, python 2.7.3 в Linux, версия Debian wheezy. Я слышал, что system () не всегда разрешена в программах MPI, но он работал для меня в течение последних пяти лет на этом компьютере. Например, я вызвал параллельный код на основе pthread из system () в программе MPI, и он использовал 100% процессорного времени для каждого потока, по желанию. Кроме того, на случай, если вы собираетесь предложить запустить скрипт Python в последовательном и просто вызывая его на нескольких узлах ... вычисление MCMC включает в себя фиксированное количество цепочек, которые должны перемещаться синхронно, поэтому, к сожалению, вычисление не может быть реорганизовано таким образом.)

Ответы на вопрос(1)

Ваш ответ на вопрос