MPI_Comm_spawn来自排名0以外的进程

时间:2017-03-26 23:55:34

标签: mpi spawn

我正在努力做到以下几点:

1 - 用mpirun -np 2 xxx
运行代码 2-Rank 1进程产生2个从属(在线发现spawn_example代码)

当我试图从等级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);
}

我不知道我做错了什么,我想知道如何让它成为可能,以便其他级别可以产生他们的奴隶并最终交换数据。
谢谢。
Edit1:我添加了完整的代码,如果你需要spawn_example,我可以提供一个链接。

1 个答案:

答案 0 :(得分:2)

这个MPI API并没有按照您的想法行事。 MPI_Comm_Spawn是一个集合调用,并使用n进程创建子MPI作业(假设当前作业具有n个进程)。您需要从所有进程中调用它(删除if)。Here就是一个例子。

并回答你的问题:为什么它从root而不是其他人工作?因为implementation。只有root进程才能执行生成进程的任务。