mpi4py: создавать процессы как потоки Python для упрощения отладки.

Для использования mpi4py стандартным подходом является использование mpiexec для запуска программы, использующей несколько процессов MPI. Например mpiexec -n 4 python3.5 myprog.py.

Теперь это затрудняет отладку, потому что нельзя напрямую использовать интерпретатор Python плюс, возможно, отладчик IDE, использующий интерпретатор Python. Однако отладка многопоточного приложения не является проблемой.

Итак, моя идея была бы такой: Вместо того, чтобы использовать mpiexec для запуска процессов, у меня есть скрипт Python, который будет запускать несколько потоков, каждый из которых будет действовать как процесс MPI, и все это происходит в интерпретаторе Python. Таким образом, использование mpiexec не было бы необходимым, и я мог бы отлаживать свое приложение, как и любую другую многопоточную программу Python. Возможно ли это и как?

(В общем, я был бы очень рад найти несколько хороших коллекций примеров или руководств по mpi4py, их не очень много.)


person Michael    schedule 31.08.2016    source источник


Ответы (1)


Вам не нужно реализовывать какую-то хардкорную идею. mpiexec уже является процессом нереста для вас. Предполагая, что вы используете отладчик pudb Python, вы можете сделать следующее:

mpiexec -np 4 xterm -e python2.7 -m pudb.run helloword.py

Опция -e для xterm указывает, какую программу xterm будет выполнять.

PS: я не тестировал его с Python 3.5, но похожее решение будет работать.

person Angelos    schedule 01.09.2016
comment
Это именно то, чего я стараюсь избегать. Я хотел бы использовать его БЕЗ mpiexec, просто обычный python, а затем запускать потоки внутри python. Это не очень хардкор. Если я забыл упомянуть: это, конечно, только для раннего тестирования и прототипирования. Тем не менее, я полностью открыт для работы с mpiexec, если он хорошо интегрируется с отладчиком моей IDE (в настоящее время PyCharm). - person Michael; 01.09.2016
comment
@ Майкл, то, чего ты пытаешься достичь, вряд ли возможно. Практически все производственные библиотеки MPI реализуют ранги как процессы, а не как потоки. Вам придется написать целую библиотеку-заглушку, которая реализует mpi4py API с использованием общей памяти при эмуляции групп процессов с потоками. Отладка MPI далеко не тривиальна, и существуют специальные параллельные отладчики, использующие клиент-серверный подход с агентами отладки в каждом процессе MPI и центральным клиентом с графическим интерфейсом. - person Hristo Iliev; 01.09.2016
comment
Хорошо, я не могу знать, как вы хотите его использовать. MPI определяет интерфейс передачи сообщений для взаимодействия процессов. Что произойдет, если вы моделируете процессы с использованием потоков? Когда вы отправляете сообщение с рангом 0, которое находится внутри потока, а поток находится внутри процесса с другими потоками, кто его получит? - person Angelos; 01.09.2016
comment
Другое дело: из-за GIL (Global Interpreter Lock) я не уверен, что использование чистых потоков Python будет работать так хорошо. GIL гарантирует, что одновременно выполняется только один поток Python. Если то, что вы пытаетесь отладить, является какой-то проблемой параллелизма, вы можете не получить точного представления о том, как ведет себя ваша программа, когда могут работать несколько процессов. - person Dave Shepard; 01.09.2016
comment
Хорошо, думаю, ответы ясны: на самом деле это невозможно. - person Michael; 02.09.2016