我想用MPI程序获取一些节点,并在每两个节点之间做一些事情.我想知道如何用MPI获取节点(计算机)?任何帮助将是欣赏.
您可以做的是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 );
Run Code Online (Sandbox Code Playgroud)
编辑:
我仍然非常不确定你所追求的是什么,但是如果你想要的是你所在的节点列表,那么可以使用它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 );
Run Code Online (Sandbox Code Playgroud)
现在,如果这是你想要做的,你会在你的MPI作业提交工具,它可以根据你MPI风味的调查可能要好得多,唯一mpirun,mpiexec,prun,srun,orterun,等,这些通常会用命令行参数允许选择要启动的进程数,要使用的节点数,每个节点的进程数,甚至是在每个选定节点上精确放置每个进程的一些方法.例如,您可以查找-npernode基于OpenMPI和MPICH的库为其mpirun实用程序提供的(潜在).
例如,你可以简单地使用:
mpirun -npernode 1 hostname
Run Code Online (Sandbox Code Playgroud)