【问题标题】:Create MPI processes on the fly with fork?使用 fork 即时创建 MPI 进程?
【发布时间】:2012-03-31 05:05:53
【问题描述】:

如果我使用 MPI,我会在运行主程序时指定多个进程。但是,我想从一个进程开始,并在运行时动态决定是否以及何时需要更多进程,以分叉更多进程。这或类似的可能吗?

否则我将不得不重新发明我非常想避免的 MPI。

【问题讨论】:

  • 请参考我对 [this question][1] 的回答。 [1]:stackoverflow.com/questions/9683331/…
  • @HighPerformanceMark:但这只是一个新过程的开始。这不完全是来自当前进程的精确位置(和配置)的写入 fork 的副本。
  • 你问'这可能还是类似的事情?',我建议 mph_comm_spawn 是相似的。但如果它不适合您的要求,您可能不得不重写 MPI。或者使用另一个并行化库/工具集/方法。
  • 既然你说的是分叉,看起来你所有的进程都在同一个节点上运行。 MPI 不做这种假设,并且 MPI 进程可能分散在集群上的许多节点中。这就是为什么,正如 HighPerformanceMark 所说,最接近您想要的 MPI 操作是 spawn。要以 MPI 方式进行某种分叉,您必须生成一个新进程并使用 P2P 通信将其初始状态发送给它。

标签: fork mpi inter-process-communicat


【解决方案1】:

无法使用fork(),因为子进程将无法使用 MPI 函数。 MPI 中有一个简单的机制来动态创建新进程。您必须使用MPI_Comm_spawn 函数或MPI_Comm_spawn_mutliple

OpenMPI 文档:http://www.open-mpi.org/doc/v1.4/man3/MPI_Comm_spawn.3.php

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

#define NUM_SPAWNS 2

int main( int argc, char *argv[] )
{
  int np = NUM_SPAWNS;
  int errcodes[NUM_SPAWNS];
  MPI_Comm parentcomm, intercomm;

  MPI_Init( &argc, &argv );
  MPI_Comm_get_parent( &parentcomm );
  if (parentcomm == MPI_COMM_NULL) {
    MPI_Comm_spawn( "spawn_example", MPI_ARGV_NULL, np, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm, errcodes );
    printf("I'm the parent.\n");
  } else {
    printf("I'm the spawned.\n");
  }
  fflush(stdout);
  MPI_Finalize();
  return 0;
}

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2021-07-09
    • 1970-01-01
    • 2014-07-20
    • 2021-12-15
    • 1970-01-01
    • 2014-07-27
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多