Mpi 探测器似乎消耗了CPU

Mpi 探测器似乎消耗了CPU,mpi,openmpi,Mpi,Openmpi,我有一个MPI程序,由一个主进程组成,它将命令传递给一堆从进程。当接收到命令时,从机只需调用system()即可。当从机等待命令时,它们消耗了各自CPU的100%。Probe()似乎处于一个紧密的循环中,但这只是一个猜测。你认为这可能是什么原因造成的,我能做些什么来修复它 下面是从进程中等待命令的代码。同时查看日志和top命令表明,当从机使用其CPU时,它们就在这个函数中 MpiMessage Mpi::BlockingRecv() { LOG(8, "BlockingRecv");

我有一个MPI程序,由一个主进程组成,它将命令传递给一堆从进程。当接收到命令时,从机只需调用system()即可。当从机等待命令时,它们消耗了各自CPU的100%。Probe()似乎处于一个紧密的循环中,但这只是一个猜测。你认为这可能是什么原因造成的,我能做些什么来修复它

下面是从进程中等待命令的代码。同时查看日志和top命令表明,当从机使用其CPU时,它们就在这个函数中

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消息:

  • 忙碌的等待。这将尽可能快地将消息输入您的接收代码。某些处理器除了检查传入消息之外什么也不做。如果将所有处理器都置于这种状态,系统的其余部分将非常缓慢。默认情况下,MPI使用主动模式
  • 忙着等待。这将在执行繁忙等待时让位于其他进程。如果您请求的进程数大于您拥有的处理器数,MPI将切换到降级模式。您还可以使用强制攻击或降级模式
  • 投票。即使降级的忙等待仍然是忙等待,它将使每个正在等待的进程的一个处理器保持100%。如果您的系统上有其他不想与之竞争的任务,您可以在调用阻塞接收之前先使用睡眠调用进行循环。我发现100毫秒的睡眠对于我的任务来说已经足够灵敏了,并且在工作人员空闲时仍然可以将CPU的使用保持在最低限度

  • 我进行了一些搜索,发现如果您没有将处理器与其他任务共享,则会出现问题。

    请注意,在使用OpenFabrics interconnect(InfiniBand或iWARP)的系统上调用
    fork()
    时,应注意可能出现的分段错误。谢谢!事实上,我运行的进程比处理器多。
    mpirun -np N --mca mpi_yield_when_idle 1 ./a.out