我想用MPI程序获取一些节点,并在每两个节点之间做一些事情。我想知道如何用MPI获取节点(计算机)? 任何帮助都会很感激。
答案 0 :(得分:5)
您可以使用提示MPI_Comm_split_type()
使用MPI_COMM_TYPE_SHARED
创建每个节点的通信器。然后,获取每个节点上的流程级别,并使用它们创建相同本地级别的流程的通信器。
代码看起来像这样:
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}},mpiexec
,prun
,srun
等。这些通常带有命令行参数,允许选择要启动的进程数,要使用的节点数,数量每个节点的进程数,甚至是将每个进程精确放置在各个选定节点上的某些方法。例如,您可以查找基于OpenMPI和MPICH的库为其orterun
实用程序提供的(潜在)-npernode
。
例如,您可以使用:
mpirun