我正在使用Rmpi(v.6.2-2)软件包来并行化我的R(v.2.15)代码。我有以下代码和平:
library(Rmpi)
source("slaveFunction04.r")
mpi.spawn.Rslaves(nslaves=2)
mpi.bcast.Robj2slave(slaveFunction04)
mpi.remote.exec(slaveFunction04())
mpi.close.Rslaves()
mpi.quit()
当从属服务器正在执行slaveFunction04时,我希望主进程处于空闲状态,消耗的资源非常少,就像你在使用带有C或Fortran的MPI时那样。但相反,主服务器正在消耗100%的CPU,就像从服务器一样(每个进程都在自己的核心中运行)。
知道为什么会这样,我该如何解决呢?
对于MPI,我在OpenSuse 12.3上使用OpenMPI v.1.6-3.1.2。
提前致谢。
答案 0 :(得分:5)
这并不罕见,实际上几乎是我期望在C或Fortran中看到的以及主从分解。
MPI专为高性能并行计算而设计,通常如果任务被阻塞等待消息,那么没有比尽可能快地获取消息更重要的事情,因此实现“忙等待”,反复轮询以查看消息是否已到达,从而占用CPU。这会占用CPU时间,但根据假设,没有别的事可做,当消息 到达时,它会减少延迟的微秒。在大多数MPI实现中,该操作模式通常是默认操作;它在OpenMPI中被称为“激进”模式,并被描述为here。
对于许多问题来说,这是一个非常明智的默认行为,但并不总是你想要的,所以有办法将其关闭。如果这是您所看到的原因,您应该能够通过将环境变量OMPI_MCA_mpi_yield_when_idle
设置为1(或非零)到get out of aggressive mode来减少主服务器上的CPU负载。