2017-06-28 23 views
0

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

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 
+1

您正在使用哪种MPI实现? – francescalus

+1

您正在使用哪种CPU架构?你是什​​么意思的字*“处理器”*?你是指一个插座中的物理CPU吗?还是一个CPU内核?还是超线程虚拟内核?你只有一台电脑或一个集群? –

回答

0

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

的另一种选择我有时用的是(与Open MPI)

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

注意,当你超额认购您的节点不进行结合的可能性。

+0

我会说处理器是直接来自'MPI_Comm_rank()'和'MPI_Comm_size()' –

+0

,所以这些不是'处理器',而是'队伍' –

+0

是的,这是正确的。我想说一个更好的方式来说明我正在寻找的是找出mpi如何在超额认购的场景中分配等级。我认为默认情况下,它会轮流通过,但我想提供一个结果显示这一点的输出。 例如,我在我的双核笔记本电脑上运行代码。我知道只有2个可用的处理器。但是,我可以通过选择使用'mpirun -n 8 myprogram'运行来超额订购处理器...我想通过本地等级值 –

0

不幸的是,在MPI中,对于不同的含义使用相同的单词是很常见的。

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

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

我将使用单词处理器来标识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 
相关问题