在 C 中使用 MPI 程序获取节点

get Nodes with MPI program in C

我想用 MPI 程序获取一些节点,并在每 2 个节点之间做一些事情。我想知道如何使用 MPI 获取节点(计算机)? 任何帮助将不胜感激。

您可以做的是使用提示 MPI_COMM_TYPE_SHARED 使用 MPI_Comm_split_type() 创建每个节点的通信器。然后,获取每个节点上进程的等级,并使用它们创建相同本地等级的进程的通信器。

从那里开始,本地等级0的进程对应的通信器内的进程将全部在不同的节点上。因此,您可以将其用于任何后续测试。

代码看起来像这样:

int globalRank, localRank;
MPI_Comm nodeComm, masterComm;

MPI_Comm_rank( MPI_COMM_WORLD, &globalRank);
MPI_Comm_split_type( MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, globalRank,
                     MPI_INFO_NULL, &nodeComm );
MPI_Comm_rank( nodeComm, &localRank);
MPI_Comm_split( MPI_COMM_WORLD, localRank, globalRank, &masterComm );
MPI_Comm_free( &nodeComm );

if ( localRank == 0 ) {
    // Now, each process of masterComm is on a different node
    // so you can play with them to do what you want
    int mRank, mSize;
    MPI_Comm_rank( masterComm, &mRank );
    MPI_Comm_size( masterComm, &mSize );
    // do something here
}

MPI_Comm_free( &masterComm );

编辑:

我仍然不确定你在寻找什么,但如果你想要的是你所在节点的列表,可能是使用 MPI_Get_processor_name() 来检索当前节点的名称process' 节点并像这样打印它(跟进上一部分以替换 "do something here" 注释):

char name[MPI_MAX_PROCESSOR_NAME];
int len;
MPI_Get_processor_name( name, &len );
printf( "Node number %d/%d is %s\n", mRank, mSize, name );

现在,如果这是您唯一想做的事情,您可能最好研究一下 MPI 作业提交工具,根据您的 MPI 风格,它可以是 mpirunmpiexecprunsrunorterun 等。这些通常带有命令行参数,允许 select 要启动的进程数、要启动的节点数使用,每个节点的进程数,甚至是将每个进程精确放置在各种 selected 节点上的一些方法。例如,您可以查找基于 OpenMPI 和 MPICH 的库为其 mpirun 实用程序提供的(潜在)-npernode

例如,您可以简单地使用:

mpirun -npernode 1 hostname