Fortran 如何在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”处理器上运行相同

我有一个基本程序,我正试图运行它来确定MPI将任务放置在哪里,因为任务的数量大于可用处理器的数量(超额订阅)。例如,如果我运行,
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