使用C语言中的MPI程序获取节点

使用C语言中的MPI程序获取节点,c,mpi,nodes,C,Mpi,Nodes,我想用MPI程序获得一些节点,并在每两个节点之间执行一些操作。我想知道怎么可能用MPI获取节点(计算机器)? 任何帮助都将不胜感激。您可以使用MPI\u Comm\u split\u type()使用提示MPI\u Comm\u type\u SHARED创建每个节点的通信器。然后,获取每个节点上进程的列组,并使用它们创建具有相同本地列组的进程的通讯器 从那里开始,通讯器内的进程(对应于本地秩0的进程)将全部位于不同的节点上。因此,您可以将其用于任何后续测试 代码如下所示: int global

我想用MPI程序获得一些节点,并在每两个节点之间执行一些操作。我想知道怎么可能用MPI获取节点(计算机器)?
任何帮助都将不胜感激。

您可以使用
MPI\u Comm\u split\u type()
使用提示
MPI\u Comm\u type\u SHARED
创建每个节点的通信器。然后,获取每个节点上进程的列组,并使用它们创建具有相同本地列组的进程的通讯器

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

代码如下所示:

int globalRank,localRank;
MPI_通信节点通信、主通信;
MPI通信等级(MPI通信世界和全球等级);
MPI_通信类型拆分(MPI_通信类型世界、MPI_通信类型共享、全球排名、,
MPI_INFO_NULL和nodecom);
MPI通信等级(节点等级和本地等级);
MPI通信拆分(MPI通信世界、localRank、globalRank和masterComm);
MPI_无通信(&nodeComm);
if(localRank==0){
//现在,masterComm的每个进程都位于不同的节点上
//所以你可以和他们一起玩,做你想做的事
int mRank,mSize;
MPI通信等级(主通信和mRank);
MPI通信大小(主通信和mSize);
//在这里做点什么
}
无MPI通信(主通信和主通信);

编辑

我仍然很不确定您想要的是什么,但如果您想要的是所处节点的列表,则可以使用
MPI\u Get\u processor\u name()
检索当前进程节点的名称,并按如下方式打印(作为上一部分的后续操作,以替换“do somethine here”注释):

char name[MPI_MAX_PROCESSOR_name];
内伦;
MPI\u获取\u处理器\u名称(名称和长度);
printf(“节点号%d/%d是%s\n”,mRank,mSize,name);
现在,如果这是您想要做的唯一一件事,那么您最好研究一下您的MPI作业提交工具,根据您的MPI风格,
mpirun
mpiexec
prun
srun
orterun
,等等。这些通常带有命令行参数,允许选择要启动的进程数、要使用的节点数、每个节点的进程数,甚至可以选择将每个进程精确放置在各个选定节点上的方法。例如,您可以查找(潜在的)
-npernode
,基于OpenMPI和MPICH的库都为它们的
mpirun
实用程序提供了它

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

mpirun-npernode 1主机名

您可以使用
MPI\u Comm\u split\u type()
使用提示
MPI\u Comm\u type\u SHARED
创建每个节点的通信器。然后,获取每个节点上进程的列组,并使用它们创建具有相同本地列组的进程的通讯器

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

代码如下所示:

int globalRank,localRank;
MPI_通信节点通信、主通信;
MPI通信等级(MPI通信世界和全球等级);
MPI_通信类型拆分(MPI_通信类型世界、MPI_通信类型共享、全球排名、,
MPI_INFO_NULL和nodecom);
MPI通信等级(节点等级和本地等级);
MPI通信拆分(MPI通信世界、localRank、globalRank和masterComm);
MPI_无通信(&nodeComm);
if(localRank==0){
//现在,masterComm的每个进程都位于不同的节点上
//所以你可以和他们一起玩,做你想做的事
int mRank,mSize;
MPI通信等级(主通信和mRank);
MPI通信大小(主通信和mSize);
//在这里做点什么
}
无MPI通信(主通信和主通信);

编辑

我仍然很不确定您想要的是什么,但如果您想要的是所处节点的列表,则可以使用
MPI\u Get\u processor\u name()
检索当前进程节点的名称,并按如下方式打印(作为上一部分的后续操作,以替换“do somethine here”注释):

char name[MPI_MAX_PROCESSOR_name];
内伦;
MPI\u获取\u处理器\u名称(名称和长度);
printf(“节点号%d/%d是%s\n”,mRank,mSize,name);
现在,如果这是您想要做的唯一一件事,那么您最好研究一下您的MPI作业提交工具,根据您的MPI风格,
mpirun
mpiexec
prun
srun
orterun
,等等。这些通常带有命令行参数,允许选择要启动的进程数、要使用的节点数、每个节点的进程数,甚至可以选择将每个进程精确放置在各个选定节点上的方法。例如,您可以查找(潜在的)
-npernode
,基于OpenMPI和MPICH的库都为它们的
mpirun
实用程序提供了它

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

mpirun-npernode 1主机名

感谢您的评论和分享链接,可能重复。我已经编辑了我的问题。可能重复感谢您的评论和分享链接。我已经编辑了我的问题。非常感谢。是的,这就是我需要的。非常感谢。是的,这就是我需要的。