Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道进程在MPI中运行在哪个核心上?_Mpi - Fatal编程技术网

如何知道进程在MPI中运行在哪个核心上?

如何知道进程在MPI中运行在哪个核心上?,mpi,Mpi,我目前正在从事一个项目,我需要知道进程当前在MPI中运行的处理器的coreid?MPI中有一个函数名为MPI\u Get\u processor\u name(char*name,int*resultlen)。这只提供进程运行的节点的名称。我想知道运行它的核心的id?可能吗?如果是这样的话,有人能给我一段代码吗 谢谢您的问题假设每个MPI进程都绑定到一个CPU核心上运行。这不是许多集群MPI实现的默认行为。例如,Open MPI具有必要的绑定机制,但必须使用--bind to core或--bi

我目前正在从事一个项目,我需要知道进程当前在MPI中运行的处理器的coreid?MPI中有一个函数名为MPI\u Get\u processor\u name(char*name,int*resultlen)。这只提供进程运行的节点的名称。我想知道运行它的核心的id?可能吗?如果是这样的话,有人能给我一段代码吗


谢谢

您的问题假设每个MPI进程都绑定到一个CPU核心上运行。这不是许多集群MPI实现的默认行为。例如,Open MPI具有必要的绑定机制,但必须使用
--bind to core
--bind to socket
选项显式启用它。另一方面,由于性能原因,现代英特尔MPI版本默认启用绑定。由于这种差异,在大多数集群MPI实现中,
MPI\u GET\u PROCESSOR\u NAME
只返回执行节点的主机名,因为在一般情况下无法识别特定的处理器

当每个进程运行绑定到一个核心时,通常可以通过读取进程的关联掩码来获得绑定。这依赖于操作系统,但有些库可以将其抽象掉,例如(开放MPI的一部分,但作为一个完全独立的项目开发,因此可以单独使用)。在一般情况下,也可以读取关联掩码-当进程未绑定时,关联掩码将仅与系统关联掩码匹配(即允许在所有处理器上执行)


有些平台的绑定是系统硬件工作的一部分,例如IBM Blue Gene。在这里,每个MPI进程在一个且唯一可识别的处理器上执行,
MPI\u Get\u processor\u name
在每个调用进程中返回一个唯一的字符串值。

您的问题假设每个MPI进程运行时绑定到一个CPU核心。这不是许多集群MPI实现的默认行为。例如,Open MPI具有必要的绑定机制,但必须使用
--bind to core
--bind to socket
选项显式启用它。另一方面,由于性能原因,现代英特尔MPI版本默认启用绑定。由于这种差异,在大多数集群MPI实现中,
MPI\u GET\u PROCESSOR\u NAME
只返回执行节点的主机名,因为在一般情况下无法识别特定的处理器

当每个进程运行绑定到一个核心时,通常可以通过读取进程的关联掩码来获得绑定。这依赖于操作系统,但有些库可以将其抽象掉,例如(开放MPI的一部分,但作为一个完全独立的项目开发,因此可以单独使用)。在一般情况下,也可以读取关联掩码-当进程未绑定时,关联掩码将仅与系统关联掩码匹配(即允许在所有处理器上执行)


有些平台的绑定是系统硬件工作的一部分,例如IBM Blue Gene。每个MPI进程在一个且唯一可识别的处理器上执行,并且
MPI\u Get\u processor\u name
在每个调用进程中返回一个唯一的字符串值。

下面的代码为绑定它们的每个进程提供CoreID。这需要Hristo Iliev在上一个答案评论中建议的hwloc库

    #include <stdio.h>
    #include "mpi.h"
    #include <hwloc.h>

    int main(int argc, char* argv[])
    {
        int rank, size;
        cpu_set_t mask;
        long num;
        int proc_num(long num);

        hwloc_topology_t topology;
        hwloc_cpuset_t cpuset;
        hwloc_obj_t obj;


        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);

        hwloc_topology_init ( &topology);
        hwloc_topology_load ( topology);

        hwloc_bitmap_t set = hwloc_bitmap_alloc();
        hwloc_obj_t pu;
        int err;

        err = hwloc_get_proc_cpubind(topology, getpid(), set, HWLOC_CPUBIND_PROCESS);
        if (err) {
        printf ("Error Cannot find\n"), exit(1);
        }

        pu = hwloc_get_pu_obj_by_os_index(topology, hwloc_bitmap_first(set));
        printf ("Hello World, I am %d and pid: %d coreid:%d\n",rank,getpid(),hwloc_bitmap_first(set));

        int my_coreid = hwloc_bitmap_first(set);
        int all_coreid[size];
        hwloc_bitmap_free(set);
        hwloc_topology_destroy(topology);
        MPI_Finalize();
        return 0;

}
#包括
#包括“mpi.h”
#包括
int main(int argc,char*argv[])
{
int等级、大小;
cpu设置屏蔽;
长数;
int proc_num(long num);
hwloc_拓扑\u t拓扑;
hwloc_cpuset_t cpuset;
hwloc_obj_t obj;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
hwloc_topology_init(&topology);
hwloc_拓扑_负载(拓扑);
hwloc_bitmap_t set=hwloc_bitmap_alloc();
hwloc_obj_t pu;
INTERR;
err=hwloc\u get\u proc\u cpubind(拓扑,getpid(),set,hwloc\u cpubind\u进程);
如果(错误){
printf(“找不到错误”),退出(1);
}
pu=hwloc_通过索引获取pu_对象(拓扑,hwloc_位图_优先(集合));
printf(“你好,世界,我是%d,pid:%d coreid:%d\n”,排名,getpid(),hwloc_bitmap_first(set));
int my_coreid=hwloc_bitmap_first(设置);
int all_coreid[大小];
hwloc_位图_自由(设置);
hwloc_拓扑图_销毁(拓扑图);
MPI_Finalize();
返回0;
}

以下是代码,它为绑定它们的每个进程提供coreid。这需要Hristo Iliev在上一个答案评论中建议的hwloc库

    #include <stdio.h>
    #include "mpi.h"
    #include <hwloc.h>

    int main(int argc, char* argv[])
    {
        int rank, size;
        cpu_set_t mask;
        long num;
        int proc_num(long num);

        hwloc_topology_t topology;
        hwloc_cpuset_t cpuset;
        hwloc_obj_t obj;


        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);

        hwloc_topology_init ( &topology);
        hwloc_topology_load ( topology);

        hwloc_bitmap_t set = hwloc_bitmap_alloc();
        hwloc_obj_t pu;
        int err;

        err = hwloc_get_proc_cpubind(topology, getpid(), set, HWLOC_CPUBIND_PROCESS);
        if (err) {
        printf ("Error Cannot find\n"), exit(1);
        }

        pu = hwloc_get_pu_obj_by_os_index(topology, hwloc_bitmap_first(set));
        printf ("Hello World, I am %d and pid: %d coreid:%d\n",rank,getpid(),hwloc_bitmap_first(set));

        int my_coreid = hwloc_bitmap_first(set);
        int all_coreid[size];
        hwloc_bitmap_free(set);
        hwloc_topology_destroy(topology);
        MPI_Finalize();
        return 0;

}
#包括
#包括“mpi.h”
#包括
int main(int argc,char*argv[])
{
int等级、大小;
cpu设置屏蔽;
长数;
int proc_num(long num);
hwloc_拓扑\u t拓扑;
hwloc_cpuset_t cpuset;
hwloc_obj_t obj;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
hwloc_topology_init(&topology);
hwloc_拓扑_负载(拓扑);
hwloc_bitmap_t set=hwloc_bitmap_alloc();
hwloc_obj_t pu;
INTERR;
err=hwloc\u get\u proc\u cpubind(拓扑,getpid(),set,hwloc\u cpubind\u进程);
如果(错误){
printf(“找不到错误”),退出(1);
}
pu=hwloc_通过索引获取pu_对象(拓扑,hwloc_位图_优先(集合));
printf(“你好,世界,我是%d,pid:%d coreid:%d\n”,排名,getpid(),hwloc_bitmap_first(set));
int my_coreid=hwloc_bitmap_first(设置);
int all_coreid[大小];
hwloc_位图_自由(设置);
hwloc_拓扑图_销毁(拓扑图);
MPI_最终确定