Ssh 在多台计算机上运行mpi

Ssh 在多台计算机上运行mpi,ssh,mpi,distributed-computing,mpich,Ssh,Mpi,Distributed Computing,Mpich,我可以在一台具有任意进程数的机器上运行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

我可以在一台具有任意进程数的机器上运行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

下面的错误发生在我在分布式环境中运行程序时。更有趣的是,它总是发生在一些分布中:例如8个进程,12个进程。10个过程都不会发生这种情况

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

那么,在一台机器上运行mpi程序和在多台机器上运行mpi程序有什么区别吗?

我偶然发现了这个问题,但仍然不知道为什么。当我将isend请求保存在向量中时,一切都正常。但是如果我不保存它们,错误就会出现。它有时是std::length::error,有时更长,如下所示

我可以提到的代码可以在中找到。 如果我更改此行:

mpiSendRequest.push_back(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)
terminate在抛出“boost::exception\u detail::clone\u impl”的实例后调用
what():MPI_Alloc_mem:无法为MPI_Alloc_mem分配内存,错误堆栈:
MPI_Alloc_mem(115):MPI_Alloc_mem(大小=160061422,MPI_INFO_NULL,baseptr=0x7fffbb499e90)失败
MPI_Alloc_mem(96)。:无法为MPI_Alloc_mem分配内存
在抛出“boost::exception\u detail::clone\u impl”的实例后调用terminate
what():MPI_Alloc_mem:无法为MPI_Alloc_mem分配内存,错误堆栈:
MPI_Alloc_mem(115):MPI_Alloc_mem(大小=1699946540,MPI_INFO_NULL,baseptr=0x7fffdad0ee10)失败
MPI_Alloc_mem(96)。:无法为MPI_Alloc_mem分配内存
[代理:0:1@mpi_notebook]HYD_pmcd_pmip_control_cmd_cb(./pm/pmiserv/pmip_cb.c:928):断言(!关闭)失败
[代理:0:1@mpi_notebook]HYDT\u dmxu\u poll\u wait\u for\u事件(./tools/demux/demux\u poll.c:77):回调返回错误状态
[代理:0:1@mpi_notebook]main(./pm/pmiserv/pmip.c:226):等待事件的解复用引擎错误
=====================================================================================
=某个应用程序进程的错误终止
=退出代码:134
=清理剩余流程
=您可以忽略以下清理消息
=====================================================================================
应用程序以退出字符串终止:中止(信号6)

我偶然发现了问题,但仍然不知道原因。当我将isend请求保存在向量中时,一切都正常。但是如果我不保存它们,错误就会出现。它有时是std::length::error,有时更长,如下所示

我可以提到的代码可以在中找到。 如果我更改此行:

mpiSendRequest.push_back(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)
terminate在抛出“boost::exception\u detail::clone\u impl”的实例后调用
what():MPI_Alloc_mem:无法为MPI_Alloc_mem分配内存,错误堆栈:
MPI_Alloc_mem(115):MPI_Alloc_mem(大小=160061422,MPI_INFO_NULL,baseptr=0x7fffbb499e90)失败
MPI_Alloc_mem(96)。:无法为MPI_Alloc_mem分配内存
在抛出“boost::exception\u detail::clone\u impl”的实例后调用terminate
what():MPI_Alloc_mem:无法为MPI_Alloc_mem分配内存,错误堆栈:
MPI_Alloc_mem(115):MPI_Alloc_mem(大小=1699946540,MPI_INFO_NULL,baseptr=0x7fffdad0ee10)失败
MPI_Alloc_mem(96)。:无法为MPI_Alloc_mem分配内存
[代理:0:1@mpi_notebook]HYD_pmcd_pmip_control_cmd_cb(./pm/pmiserv/pmip_cb.c:928):断言(!关闭)失败
[代理:0:1@mpi_notebook]HYDT\u dmxu\u poll\u wait\u for\u事件(./tools/demux/demux\u poll.c:77):回调返回错误状态
[代理:0:1@mpi_notebook]main(./pm/pmiserv/pmip.c:226):等待事件的解复用引擎错误
=====================================================================================
=某个应用程序进程的错误终止
=退出代码:134
=清理剩余流程
=您可以忽略以下清理消息
=====================================================================================
应用程序以退出字符串终止:中止(信号6)

看起来它是代码内部的东西,而不是mpi方面的东西。确保将向量的长度分配给每个处理器时,其长度是正确的。将
/myMpiProg…
替换为像
主机名这样简单的内容时,它是否有效?>更有趣的是,在某些分布中总是会发生这种情况:例如8个进程,12个进程。10个过程都不会发生这种情况。这就是你的答案。代码是在使用长度为10的向量的地方编写的。我的建议是更改您的代码,以确保它使用MPI_Comm_size()而不是预定义的值。@PoojaNilangekar我已经使用了MPI_Comm_size()。事实上,10只是一个样本。它还运行4个或6个进程。@Sleepyhead它可能在我的代码中,正如你所说的。我正在检查我的代码。看起来它是代码中的某个内容,而不是mpi端。确保将向量的长度分配给每个处理器时,其长度是正确的。将
/myMpiProg…
替换为像
主机名这样简单的内容时,它是否有效?>更有趣的是,在某些分布中总是会发生这种情况:例如8个进程,12个进程。10个过程都不会发生这种情况。这就是你的答案。代码是在使用长度为10的向量的地方编写的。我的建议是更改您的代码,以确保它使用MPI_Comm_size()而不是预定义的值。@PoojaNilangekar我已经使用了MPI_Comm_size()。事实上,10只是一个样本。它还运行4个或6个进程。@Sleepyhead它可能在我的代码中,正如你所说的。我正在检查我的代码。