如何知道MPI中正在运行哪个进程?

时间:2013-02-04 15:16:30

标签: mpi

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

谢谢

2 个答案:

答案 0 :(得分:2)

这是代码,它为每个绑定它们的进程提供coreids。这需要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;

}

答案 1 :(得分:1)

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

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

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