C OpenMPI将永远等待

C OpenMPI将永远等待,c,openmpi,C,Openmpi,当我执行这段代码时,我没有任何响应,它总是在等待,进程1正在向根进程发送数据,但根进程没有接收到数据(或者几乎就是我所想的) #包括 #包括 #包括“mpi.h” void my_parallel_函数(int v[],int size,int rank) { MPI_状态; int i; 如果(秩==0) { MPI_发送(&v[0],10,MPI_INT,1,1,MPI_COMM_WORLD); } 其他的 { MPI_Recv(&v[0]、10、MPI_INT、MPI_任意源、1、MPI_

当我执行这段代码时,我没有任何响应,它总是在等待,进程1正在向根进程发送数据,但根进程没有接收到数据(或者几乎就是我所想的)

#包括
#包括
#包括“mpi.h”
void my_parallel_函数(int v[],int size,int rank)
{
MPI_状态;
int i;
如果(秩==0)
{
MPI_发送(&v[0],10,MPI_INT,1,1,MPI_COMM_WORLD);
}
其他的
{
MPI_Recv(&v[0]、10、MPI_INT、MPI_任意源、1、MPI_通信世界和状态);

对于(i=0;i
my_parallel_函数
仅在
rank
为0时调用。因此当
rank
为1时,不会向rank 0发送任何内容,它的
MPI_Recv
将永远等待。只需从
main
中删除
if
即可在MPI程序中实现菜单的正确方法是:

while (op != 0)
{
   if (rank == 0)
   {
      printf("Welcome to example program!\n\n");
      printf("\t1.- Call Parallel Function\n");
      printf("\t2.- Call another Function\n");
      printf("\t0.- Exit\n\t");

      printf("\n\n\tEnter option:");
      scanf("%d", &op);
   }

   // Broadcast the user's choice to all other ranks
   MPI_Bcast(&op, MPI_INT, 1, 0, MPI_COMM_WORLD);

   switch(op)
   {
      case 1:
         my_parallel_function(vect, size, rank);
         MPI_Barrier(MPI_COMM_WORLD);
         if (rank == 0)
            printf("Parallel function called successfully\n\n");
         break;
      case 2:
         simpleFunction();
         MPI_Barrier(MPI_COMM_WORLD);
         if (rank == 0)
            printf("Function called successfully\n\n");
         break;
   }
}
这两个障碍并不是绝对必要的——它们只是确保所有级别的呼叫都已返回


请注意,MPI标准不保证允许秩0从标准输入读取,并且执行此类I/O的程序不可移植。也就是说,大多数现有MPI实现确实将秩0的标准输入和输出重定向到
mpiexec
/
mpirun的标准输入和输出

你是对的,但是如果我在菜单中有并行功能,并且我不希望所有进程都输出菜单,那么怎么样?@JohnSmith,让所有进程执行菜单循环,但只执行进程0以显示菜单文本,然后使用
MPI\u Bcast
将用户选择分发到所有其他列组。
while (op != 0)
{
   if (rank == 0)
   {
      printf("Welcome to example program!\n\n");
      printf("\t1.- Call Parallel Function\n");
      printf("\t2.- Call another Function\n");
      printf("\t0.- Exit\n\t");

      printf("\n\n\tEnter option:");
      scanf("%d", &op);
   }

   // Broadcast the user's choice to all other ranks
   MPI_Bcast(&op, MPI_INT, 1, 0, MPI_COMM_WORLD);

   switch(op)
   {
      case 1:
         my_parallel_function(vect, size, rank);
         MPI_Barrier(MPI_COMM_WORLD);
         if (rank == 0)
            printf("Parallel function called successfully\n\n");
         break;
      case 2:
         simpleFunction();
         MPI_Barrier(MPI_COMM_WORLD);
         if (rank == 0)
            printf("Function called successfully\n\n");
         break;
   }
}