Mpi 探测器似乎消耗了CPU
我有一个MPI程序,由一个主进程组成,它将命令传递给一堆从进程。当接收到命令时,从机只需调用system()即可。当从机等待命令时,它们消耗了各自CPU的100%。Probe()似乎处于一个紧密的循环中,但这只是一个猜测。你认为这可能是什么原因造成的,我能做些什么来修复它 下面是从进程中等待命令的代码。同时查看日志和top命令表明,当从机使用其CPU时,它们就在这个函数中Mpi 探测器似乎消耗了CPU,mpi,openmpi,Mpi,Openmpi,我有一个MPI程序,由一个主进程组成,它将命令传递给一堆从进程。当接收到命令时,从机只需调用system()即可。当从机等待命令时,它们消耗了各自CPU的100%。Probe()似乎处于一个紧密的循环中,但这只是一个猜测。你认为这可能是什么原因造成的,我能做些什么来修复它 下面是从进程中等待命令的代码。同时查看日志和top命令表明,当从机使用其CPU时,它们就在这个函数中 MpiMessage Mpi::BlockingRecv() { LOG(8, "BlockingRecv");
MpiMessage
Mpi::BlockingRecv() {
LOG(8, "BlockingRecv");
MpiMessage result;
MPI::Status status;
MPI::COMM_WORLD.Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, status);
result.source = status.Get_source();
result.tag = status.Get_tag();
int num_elems = status.Get_count(MPI_CHAR);
char buf[num_elems + 1];
MPI::COMM_WORLD.Recv(
buf, num_elems, MPI_CHAR, result.source, result.tag
);
result.data = buf;
LOG(7, "BlockingRecv about to return (%d, %d)", result.source, result.tag);
return result;
}
对,;大多数MPI实现,为了提高性能,都在忙着等待阻塞操作。假设MPI作业是我们在处理器上唯一关心的事情,如果任务在等待通信时被阻塞,最好的做法是不断轮询该通信以减少延迟;因此,在消息到达和传递给MPI任务之间几乎没有延迟。这通常意味着CPU被固定在100%,即使没有“真正的”正在做 对于大多数MPI用户来说,这可能是最好的默认行为,但并不总是您想要的。通常,MPI实现允许关闭此功能;有了OpenMPI
听起来有三种方法可以等待MPI消息:
我进行了一些搜索,发现如果您没有将处理器与其他任务共享,则会出现问题。请注意,在使用OpenFabrics interconnect(InfiniBand或iWARP)的系统上调用
fork()
时,应注意可能出现的分段错误。谢谢!事实上,我运行的进程比处理器多。
mpirun -np N --mca mpi_yield_when_idle 1 ./a.out