Используя mpi4py, я запускаю программу на python, которая запускает несколько процессов fortran параллельно, начиная со скрипта SLURM, используя (например):
mpirun -n 4 python myprog.py
но заметили, что myprog.py выполняется дольше, чем больше число запрошенных задач, например. работает myprog.py (следующий код показывает только часть программы mpi):
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
data = None
if rank == 0:
data = params
recvbuf = np.empty(4, dtype=np.float64)
comm.Scatter(data, recvbuf, root=0)
py_task(int(recvbuf[0]), recvbuf[1], recvbuf[2], int(recvbuf[3]))
с mpirun -n 1 ... для одного массива recvbuf занимает 3 минуты, в то время как работа с четырьмя массивами recvbuf (предположительно параллельно), на четырех процессорах, использующих mpirun -n 4 ..., занимает около 5 минут. Тем не менее, я ожидаю, что время выполнения будет примерно одинаковым как для одного, так и для четырех процессоров.
py_task - это по сути оболочка Python для запуска программы на фортране:
subprocess.check_call(cmd)
Кажется, существует некоторое взаимодействие между subprocess.check_call (cmd) и пакетом mpi4py, который мешает коду работать должным образом параллельно.
Я искал эту проблему, но не могу найти ничего, что помогло бы ей. Есть ли какие-либо исправления этой проблемы / подробные описания, объясняющие, что здесь происходит / рекомендации о том, как выделить причину узкого места в этом коде?
Дополнительное примечание:
Этот конвейер был адаптирован для mpi4py из "параллельного импорта joblib", где ранее не было проблем с параллельным выполнением subprocess.check_call (), и поэтому я подозреваю, что эта проблема связана с взаимодействием между подпроцессом и mpi4py .