0

我目前正在从事一个项目,我需要知道该进程当前在 MPI 中运行的处理器的 coreid?MPI 中有一个名为MPI_Get_processor_name( char *name, int *resultlen )的函数。这只给出了进程正在运行的节点的名称。我想知道它正在运行的核心的 ID?可能吗?如果是这样,任何人都可以给我代码片段吗?

谢谢

4

2 回答 2

2

这是为绑定它们的每个进程提供 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;

}
于 2013-02-20T04:27:45.593 回答
1

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

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

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

于 2013-02-05T17:55:53.483 回答