用C语言获取带有MPI程序的节点

时间:2016-02-25 11:46:22

标签: c mpi nodes

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

1 个答案:

答案 0 :(得分:5)

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

从那里,对应于本地等级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()来检索当前流程的名称'节点并像这样打印(作为后续部分的后续替换"在这里做一些事情"评论):

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风格,mpirun,{{ 1}},mpiexecprunsrun等。这些通常带有命令行参数,允许选择要启动的进程数,要使用的节点数,数量每个节点的进程数,甚至是将每个进程精确放置在各个选定节点上的某些方法。例如,您可以查找基于OpenMPI和MPICH的库为其orterun实用程序提供的(潜在)-npernode

例如,您可以使用:

mpirun