我目前正在开发一个项目,我需要知道MPI中当前运行该进程的处理器的coreid? MPI中有一个名为 MPI_Get_processor_name(char * name,int * resultlen)的函数。这仅提供运行进程的节点的名称。我想知道它运行的核心的ID?可能吗?如果是这样,任何人都可以给我代码片段吗?
谢谢
答案 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
在每个调用进程中返回一个唯一的字符串值。