MPI_Comm_从秩0以外的进程生成

MPI_Comm_从秩0以外的进程生成,mpi,spawn,Mpi,Spawn,我试图做到以下几点: 1-使用mpirun-np 2 xxx运行代码 2-Rank 1进程生成2个从属(生成示例代码可在线找到) 当我尝试从等级0生成时,它工作了,但从等级1开始,它挂起并继续等待,直到我用ctrl+c停止执行 下面是代码,如果使用-np 1运行,它将正常完成,但使用-np 2时它将挂起: #include<string.h> #include<stdlib.h> #include<stdio.h> #include"mpi.h" int

我试图做到以下几点:

1-使用mpirun-np 2 xxx运行代码
2-Rank 1进程生成2个从属(生成示例代码可在线找到)

当我尝试从等级0生成时,它工作了,但从等级1开始,它挂起并继续等待,直到我用ctrl+c停止执行

下面是代码,如果使用-np 1运行,它将正常完成,但使用-np 2时它将挂起:

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include"mpi.h"


int main(int argc, char **argv)
{

   int tag = 1;
   int tag1 = 2;
   int tag2 = 3;
   int my_rank;
   int num_proc;

   int array_of_errcodes[10];

   int i;

   MPI_Status      status;
   MPI_Comm        inter_comm;



  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  MPI_Comm_size(MPI_COMM_WORLD, &num_proc);


if(my_rank==0)
{
 printf("I'm process rank %d \n ",my_rank);
}

if(my_rank==1)
{
 printf("Rank %d process is spawning 2 slaves \n",my_rank);

 MPI_Comm_spawn("spawn_example", MPI_ARGV_NULL, 2, MPI_INFO_NULL,1, MPI_COMM_WORLD, &inter_comm, array_of_errcodes);    
}

 MPI_Finalize();
 exit(0);
}
#包括
#包括
#包括
#包括“mpi.h”
int main(int argc,字符**argv)
{
int tag=1;
int tag1=2;
int tag2=3;
int我的_等级;
int num_proc;
整数数组_的_错误码[10];
int i;
MPI_状态;
MPI通信和内部通信;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和我的通信等级);
MPI_通信大小(MPI_通信世界和数量进程);
如果(我的排名==0)
{
printf(“我是进程排名%d\n”,我的排名);
}
如果(我的排名==1)
{
printf(“秩%d进程正在生成2个从属\n”,我的秩);
MPI_Comm_spawn(“spawn_示例”,MPI_ARGV_NULL,2,MPI_INFO_NULL,1,MPI_Comm_WORLD,&内部通信,错误代码数组);
}
MPI_Finalize();
出口(0);
}
我不知道我做错了什么,我想知道如何使之成为可能,以便其他队伍能够产生他们的奴隶并最终交换数据。
谢谢。

Edit1:我添加了完整的代码,如果您需要spawn_示例,我可以提供一个链接。

这个MPI API并不是您所想的那样。MPI_Comm_Spawn是一个集合调用,它使用
n
进程创建子MPI作业(假设当前作业具有
n
进程)。您需要从所有进程调用它(如果,则删除
)。这就是一个例子


回答你的问题:为什么它是从根而不是从别人那里起作用?因为天气原因。只有根进程执行生成进程的任务。

感谢您的回答,因此如果我理解正确:我无法使生成的“子mpi作业”的父进程不为0?不。但有一件事。父/子关系(即生成作业的人)仅存在于库级别,作为MPI应用程序开发人员,您无需担心,也不会影响应用程序的功能。谢谢,您真的很有帮助。