【问题标题】:How to I determine the local node placement of tasks in MPI如何确定 MPI 中任务的本地节点位置
【发布时间】:2017-06-30 20:22:09
【问题描述】:

鉴于任务数大于可用处理器数(超额订阅),我有一个基本程序,我正在尝试运行该程序以确定 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

【问题讨论】:

  • 您使用的是哪种 MPI 实现?
  • 您使用的是哪种 CPU 架构? “处理器”这个词是什么意思?您是指插槽中的物理CPU吗?还是CPU核心?还是超线程虚拟内核?您只有一台计算机还是一个集群?

标签: fortran mpi


【解决方案1】:

你能发布你的测试程序吗? “处理器 x of y”来自 MPI_Comm_rank()MPI_Comm_size() 吗? 在这种情况下,这些数字是 MPI 等级,与绑定无关。 你宁愿阅读你的 MPI 文档并弄清楚绑定是如何完成的。

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

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

请注意,当您超额订阅节点时,可能不会执行任何绑定。

【讨论】:

  • 我想说是的,处理器直接来自MPI_Comm_rank()MPI_Comm_size()
  • 所以这些不是processors,而是ranks
  • 是的,没错。我想更好的方式来说明我正在寻找的内容是找出 mpi 在超额订阅情况下如何分配排名。我认为默认情况下它会循环通过,但我想提供一个最终显示这一点的输出。例如,我在我的双核笔记本电脑上运行代码。我知道只有 2 个可用的处理器。但是,我可以通过选择使用mpirun -n 8 myprogram 运行来超额订阅处理器...我想知道 MPI 通过其本地排名值运行每个任务的确切位置
  • 您可以使用我之前提供的命令,或者查阅您的 MPI 文档。 iirc,使用 Open MPI mpirun -report-bindings ... 可以满足您的期望
【解决方案2】:

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

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

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

我将使用 processor 这个词来标识 CPU 内核,或者在启用超线程的场景中,硬件线程(尽管硬件线程并不完全是 CPU 内核)。

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

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

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

MPICH 源中还包含一个程序,用于根据操作系统打印出进程的亲和性 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2019-01-14
    相关资源
    最近更新 更多