我有一个基本程序,我试图确定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
答案 0 :(得分:0)
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
。该标准实际上并不需要返回唯一标识处理器的名称。该名称留给实现,通常倾向于报告主机的名称。这不是我认为你正在寻找的。 p>
我将使用 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