Запуск mpi на нескольких машинах

Я могу запустить свою программу mpi на одной машине с любым количеством процессов, но не могу сделать это на нескольких машинах. У меня есть файл «machines», в котором указано количество процессов на хостах:

localhost:6
another_host:4

Ниже я привел 3 примера:

// When I run the program on only localhost, everything is OK.
mpirun -n 10 ./myMpiProg parameter1 parameter2

// In this case, everything is OK, too.
mpirun -f machinesFile -n 10 ./myMpiProg parameter1 parameter2

// This is also OK
mpirun -n 8 ./myMpiProg parameter1 parameter2

Когда я изменил файл машины, например:

localhost:6
another_host:2

...

// But this does not work.
mpirun -f machinesFile -n 8 ./myMpiProg parameter1 parameter2

Приведенная ниже ошибка возникает, когда я запускаю программу в распределенной среде. Что еще интересно, так всегда бывает с некоторыми дистрибутивами: типа 8 процессов, 12 процессов. И это никогда не происходит с 10 процессами.

terminate called after throwing an instance of 'std::length_error' what():  vector::reserve

Итак, есть ли разница между запуском программы mpi на одной машине и на нескольких машинах?


person montekristo_07    schedule 12.10.2015    source источник
comment
похоже, что это что-то внутри вашего кода, а не на стороне mpi. Убедитесь, что при распределении длины вектора на каждый из процессоров его длина правильная.   -  person Sleepyhead    schedule 12.10.2015
comment
Работает ли это, когда вы заменяете ./myMpiProg ... чем-то таким простым, как hostname?   -  person Hristo Iliev    schedule 12.10.2015
comment
› Более интересно, это всегда происходит с некоторыми дистрибутивами: например, 8 процессов, 12 процессов. И это никогда не происходит с 10 процессами. Это твой ответ. Ваш код написан там, где вы используете вектор длиной 10. Я бы предложил изменить ваш код, чтобы убедиться, что он использует MPI_Comm_size() вместо предопределенного значения.   -  person Pooja Nilangekar    schedule 13.10.2015
comment
@PoojaNilangekar Я уже использовал MPI_Comm_size(). На самом деле, 10 — это всего лишь пример. Он также работает с 4 или 6 процессами.   -  person montekristo_07    schedule 19.10.2015
comment
@Sleepyhead Это может быть внутри моего кода, как вы сказали. Я сейчас проверяю свой код.   -  person montekristo_07    schedule 19.10.2015
comment
@HristoIliev Да, это работает с командой «имя хоста». Кстати, localhost может подключаться к other_host по ssh без пароля. Но обратное неверно. Должен ли я также настроить other_host для подключения к локальному хосту без пароля?   -  person montekristo_07    schedule 19.10.2015
comment
Не могли бы вы опубликовать минимальный код, в котором есть эта ошибка?   -  person Sleepyhead    schedule 19.10.2015
comment
@Sleepyhead Я пытался упростить код, но столкнулся с другой проблемой. Итак, я задал здесь новый вопрос: Теперь у меня проблема с зависанием. После того, как я смогу понять это, я обновлю вопрос здесь и поставлю код.   -  person montekristo_07    schedule 24.10.2015


Ответы (1)


Я обнаружил проблему случайно, но до сих пор не знаю, почему. Когда я сохраняю isend запросы в векторе, то все ок. Но если я их не сохраняю, появляются ошибки. Иногда это std::length::error , а иногда и дольше, как показано ниже.

Код, который я могу упомянуть, можно найти в https://stackoverflow.com/a/33375285/2979477. Если я изменю эту строку:

mpiSendRequest.push_back(world.isend(neighbors[j], 100, *p));

as:

world.isend(neighbors[j], 100, *p);

ошибка появляется. Для меня это не имеет смысла, но, возможно, этому есть разумное объяснение.

Сообщение об ошибке:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::mpi::exception> >'
what():  MPI_Alloc_mem: Unable to allocate memory for MPI_Alloc_mem, error stack:
MPI_Alloc_mem(115): MPI_Alloc_mem(size=1600614252, MPI_INFO_NULL, baseptr=0x7fffbb499e90) failed
MPI_Alloc_mem(96).: Unable to allocate memory for MPI_Alloc_mem
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::mpi::exception> >'
what():  MPI_Alloc_mem: Unable to allocate memory for MPI_Alloc_mem, error stack:
MPI_Alloc_mem(115): MPI_Alloc_mem(size=1699946540, MPI_INFO_NULL, baseptr=0x7fffdad0ee10) failed
MPI_Alloc_mem(96).: Unable to allocate memory for MPI_Alloc_mem
[proxy:0:1@mpi_notebook] HYD_pmcd_pmip_control_cmd_cb (./pm/pmiserv/pmip_cb.c:928): assert (!closed) failed
[proxy:0:1@mpi_notebook] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:77): callback returned error status
[proxy:0:1@mpi_notebook] main (./pm/pmiserv/pmip.c:226): demux engine error waiting for event

=====================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 134
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6)
person montekristo_07    schedule 27.10.2015