Fortran 如何在MPI中确定任务的本地节点位置
我有一个基本程序,我正试图运行它来确定MPI将任务放置在哪里,因为任务的数量大于可用处理器的数量(超额订阅)。例如,如果我运行,Fortran 如何在MPI中确定任务的本地节点位置,fortran,mpi,Fortran,Mpi,我有一个基本程序,我正试图运行它来确定MPI将任务放置在哪里,因为任务的数量大于可用处理器的数量(超额订阅)。例如,如果我运行,mpirun-np结果将给出: processor 0 of 4 processor 1 of 4 processor 2 of 4 processor 3 of 4 但是,如果在“8”处理器上运行相同
mpirun-np
结果将给出:
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个实际内核在运行我的程序,相反,我有多个任务在同一个处理器上运行,我想知道这些任务是如何分布的。提前谢谢
编辑:
你能发布你的测试程序吗? “处理器x/y”是否来自
MPI\u Comm\u rank()
和MPI\u Comm\u size()
?
在本例中,这些数字是MPI级别,与绑定无关。
您更希望阅读MPI文档并了解绑定是如何完成的
我有时使用的另一个选项是(使用OpenMPI)
注意,当您超额订阅节点时,可能不会执行绑定。您可以发布测试程序吗? “处理器x/y”是否来自
MPI\u Comm\u rank()
和MPI\u Comm\u size()
?
在本例中,这些数字是MPI级别,与绑定无关。
您更希望阅读MPI文档并了解绑定是如何完成的
我有时使用的另一个选项是(使用OpenMPI)
请注意,当您过度订阅节点时,可能不会执行绑定。不幸的是,在MPI中,使用相同的单词表示不同的含义是很常见的 例如,工作经理倾向于混合使用文字处理器,并将其用于不同的含义。在这种特定情况下,我将使用以下方法: 这也适用于
MPI\u Get\u processor\u name
。该标准实际上并不要求返回唯一标识处理器的名称。名称留给实现,实现通常会报告主机的名称。这不是我想你要找的
我将使用字处理器来识别CPU核心,或者在启用超线程的场景中,识别硬件线程(尽管硬件线程并不完全是CPU核心)
通常允许在不同的处理器上执行常规进程(无论是否为MPI)。这并不一定意味着进程将使用所有这些处理器,而是如果前者现在被另一个进程占用(通常是由于可操作的系统调度器),则能够从一个处理器跳转到另一个处理器
要获得进程关联(进程可以使用的处理器列表),应使用不同的接口。例如,您可以使用类似于sched_getaffinity
(不过这是C)。某些MPI实现(如“英特尔MPI”)允许您在MPI_Init
处打印进程关联,并设置环境变量
我会考虑使用现有的报告亲和力的程序。检查
MPICH源代码中还包含一个程序,用于根据操作系统打印进程()的关联性。这可以在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
不幸的是,在MPI中,使用相同的词表示不同的含义是很常见的 例如,工作经理倾向于混合使用文字处理器,并将其用于不同的含义。在这种特定情况下,我将使用以下方法: 这也适用于
MPI\u Get\u processor\u name
。该标准实际上并不要求返回唯一标识处理器的名称。名称留给实现,实现通常会报告主机的名称。这不是我想你要找的
我将使用字处理器来识别CPU核心,或者在启用超线程的场景中,识别硬件线程(尽管硬件线程并不完全是CPU核心)
通常允许在不同的处理器上执行常规进程(无论是否为MPI)。这并不一定意味着进程将使用所有这些处理器,而是如果前者现在被另一个进程占用(通常是由于可操作的系统调度器),则能够从一个处理器跳转到另一个处理器
要获得进程关联(进程可以使用的处理器列表),应使用不同的接口。例如,您可以使用类似于sched_getaffinity
(不过这是C)。某些MPI实现(如“英特尔MPI”)允许您在MPI_Init
处打印进程关联,并设置环境变量
我会考虑使用现有的报告亲和力的程序。检查
MPICH源代码中还包含一个程序,用于根据操作系统打印进程()的关联性。这可以在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
您使用的是哪种MPI实现?您使用的是哪种CPU体系结构?你说的“处理器”是什么意思?你是说插槽中的物理CPU吗?还是CPU核心?还是超线程虚拟核?您是否只有一台计算机或一个群集?您使用的是哪种MPI实现?您使用的是哪种CPU体系结构?你说的“处理器”是什么意思?你是说插槽中的物理CPU吗?还是CPU核心?还是超线程虚拟核?你只有一台计算机还是一个集群?我想说,是的,处理器直接来自
MPI\u Comm\u rank()
和MPI\u Comm\u size()
,所以这些不是处理器,而是ranks
是的,这是正确的。我想说我要找的更好的方法是找出mpi在超额订阅场景中是如何分配排名的。我认为默认情况下,它会循环运行,但我想提供一个最终显示这一点的输出。例如,我正在双核笔记本电脑上运行代码。我知道只有两个可用的处理器。但是,我可以通过选择运行来超额订阅处理器
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