按主机分组MPI任务

Jér*_*ôme 2 mpi communicator

我想在群集的每台机器上轻松地执行集体通信.假设我有4台机器,每台机器有8个核心,我的mpi程序将运行32个MPI任务.对于给定的功能,我想要的是:

  • 在每个主机上,只有一个任务执行计算,其他任务在此计算期间不执行任何操作.在我的示例中,4个MPI任务将执行计算,其他28个正在等待.
  • 一旦完成计算,每个MPI上的每个MPI任务将仅对本地任务(在同一主机上运行的任务)执行集体通信.

从概念上讲,我理解我必须为每个主机创建一个通信器.我四处搜索,没有发现任何明确的事情.我对MPI小组和传播者感到不舒服.这是我的两个问题:

  • MPI_Get_processor_name对于这样的行为是否足够独特?
  • 更一般地说,你有一段代码吗?

Jon*_*rsi 6

规范说MPI_Get_processor_name返回"实际(而不是虚拟)节点的唯一说明符",所以我认为你可以这样做.我想你会聚集在一起收集所有的主机名,然后分配处理器组来制作他们的通信器; 或者复制MPI_COMM_WORLD,将名称转换为整数哈希值,并使用mpi_comm_split对集合进行分区.

您还可以采用janneb建议的方法并使用特定于实现的选项来确保MPI实现以这种方式分配任务; OpenMPI使用--byslot生成此排序; 使用mpich2,您可以使用-print-rank-map查看映射.

但这真的是你想要做的吗?如果其他进程在一个处理器工作时处于空闲状态,那么这比每个人冗余地进行计算更好吗?(或者这是内存还是I/O密集型,你担心争用吗?)如果你要做很多这样的事情 - 处理节点内并行化与节点外并行化有很大不同 - 那么您可能想要考虑混合编程模型 - 每个节点运行一个MPI任务和MPI_spawning子任务或使用OpenMP进行节点间通信,这两者都是HPM建议的.