如何确定MPI中任务的本地节点位置

时间:2017-06-28 16:58:32

标签: fortran mpi

我有一个基本程序,我试图确定MPI将放置任务的位置,因为任务数量大于可用处理器数量(超额订阅)。例如,如果我运行mpirun -np <program name>,结果将给出:

 processor           0 of           4
 processor           1 of           4
 processor           2 of           4
 processor           3 of           4

但是,如果我在“8”处理器上运行相同的命令,我会得到:

 processor           1 of           8
 processor           2 of           8
 processor           5 of           8
 processor           6 of           8
 processor           4 of           8
 processor           3 of           8
 processor           7 of           8
 processor           0 of           8

据我所知,没有8个实际核心运行我的程序,而是我在同一个处理器上运行多个任务,我想知道它们是如何分配的。提前谢谢。

编辑:

program test

  ! Similar to "Hello World" example- trying to determine rank/ node placement
  use mpi
  implicit none

  integer ::  procid, ierr, numprocs, name_len
  integer:: local

  local= 'OMPI_COMM_WORLD_LOCAL_RANK'

  !character* (MPI_max_processor_name) name


  call MPI_INIT(ierr)
  call MPI_COMM_SIZE(MPI_COMM_World, numprocs, ierr)
  call MPI_COMM_RANK(MPI_COMM_World, procid, ierr)
  !call Mpi_Get_Processor_Name(name,name_len, ierr)

  print*, 'processor', procid, 'of', numprocs, 'On Local Node:','  ', local

  call mpi_finalize(ierr)
end program test

2 个答案:

答案 0 :(得分:0)

你可以发布你的测试程序吗? 是&#34;处理器x的y&#34;来自MPI_Comm_rank()MPI_Comm_size()? 在这种情况下,这些数字是MPI排名,与绑定无关。 你宁愿阅读你的MPI文档并弄清楚绑定是如何完成的。

我有时使用的另一个选项是(使用Open MPI)

mpirun --tag-output grep Cpus_allowed_list /proc/self/status

请注意,当您超额订阅节点时,可能无法执行绑定。

答案 1 :(得分:0)

不幸的是,在MPI中使用相同的词来表达不同的含义是很常见的。

例如,职位经理倾向于混合使用处理器这个词,并将其用于不同的含义。在这种特定情况下,我将使用以下内容:

这也适用于MPI_Get_processor_name。该标准实际上并不需要返回唯一标识处理器的名称。该名称留给实现,通常倾向于报告主机的名称。这不是我认为你正在寻找的。

我将使用 processor 一词来识别CPU核心,或者在启用超线程的情况下,识别硬件线程(尽管硬件线程不是CPU核心)。

通常允许常规进程(无论是否是MPI)在不同的处理器上执行。这并不一定意味着该进程将使用所有这些处理器,而是如果前者现在被不同的进程占用(通常由于操作系统调度程序),则能够从一个处理器反弹到另一个处理器。

要获取进程关联(进程可以使用的处理器列表),您应该使用不同的接口。例如,您可以使用sched_getaffinity之类的东西(不过这是C)。某些MPI实现(如Intel MPI)允许您在MPI_Init打印流程关联,设置环境变量。

我会考虑使用报告亲和力的现有程序。检查this page in the MPICH documentation

  

MPICH源中还包括用于根据OS打印出进程(src/pm/hydra/examples/print_cpus_allowed.c)的亲和性的程序。这可以在Linux系统上使用,以测试绑定是否正常工作。

shell$ mpiexec -n 8 -bind-to socket ./print_cpus_allowed | sort
 crush[0]: Cpus_allowed_list:    0,2,4,6
 crush[1]: Cpus_allowed_list:    1,3,5,7
 crush[2]: Cpus_allowed_list:    0,2,4,6
 crush[3]: Cpus_allowed_list:    1,3,5,7
 crush[4]: Cpus_allowed_list:    0,2,4,6
 crush[5]: Cpus_allowed_list:    1,3,5,7
 crush[6]: Cpus_allowed_list:    0,2,4,6
 crush[7]: Cpus_allowed_list:    1,3,5,7