OpenMPI永远等待着

时间:2013-11-12 14:58:40

标签: c openmpi

当我执行此代码时,我没有响应,它等待永远,进程1将数据发送到根进程,但根进程没有收到它(或几乎就是我认为的那样)。

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


void my_parallel_function(int v[], int size, int rank)
{
   MPI_Status status;
   int i;

   if(rank==0)
   {
     MPI_Send(&v[0], 10, MPI_INT, 1, 1, MPI_COMM_WORLD);
   }
   else
   {
     MPI_Recv(&v[0], 10, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD,&status);
     for(i=0;i<10;i++)
     {
        //change the value
        v[i] = i;
        //printf("hola soy nodo: %d\n", i);
     }
     MPI_Send(&v[0], 10, MPI_INT, 0, 2, MPI_COMM_WORLD);
   }

   if(rank==0)
   {
     MPI_Recv(&v[0], 10, MPI_INT, MPI_ANY_SOURCE, 2, MPI_COMM_WORLD,&status);
     for(i=1;i<size;i++)
     {
        printf("\nvalue of item %d: %d\n", i, v[i]);
     }
   }
}

void simpleFunction()
{
    printf("Hi i am a simple function\n");
}

int main(int argc, char *argv[])
{        
    int rank, size;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Status status;

    int vect[10];
    int op=1;

    while(op != 0)
    {
        //system("clear");
        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);
        switch(op)
        {
            case 1:
                    my_parallel_function(vect, size, rank);
                    printf("Parallel function called successfully\n\n");
                    break;
            case 2:
                    simpleFunction();
                    printf("Function called successfully\n\n");
                    break;
        }
    }

    MPI_Finalize();
    return 0;
}

我正在使用-np 2

执行

我认为这不应该像它应该的那样:  MPI_Recv(&v[0], 10, MPI_INT, MPI_ANY_SOURCE, 2, MPI_COMM_WORLD,&status);

有什么想法吗?非常感谢你。

编辑:但是当我删除if(rank == 0)时,我得到了所有从属进程的i / o,这意味着菜单打印的次数很多。我是OpenMPI的新手,如何解决这个问题?

非常感谢!

2 个答案:

答案 0 :(得分:1)

my_parallel_function仅在rank为0时调用。因此,当rank为1时,不会向0级发送任何内容,而MPI_Recv将永远等待。只需从if中删除main

答案 1 :(得分:1)

在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;
   }
}

这两个障碍并非绝对必要 - 他们只是确保所有职级都有回复。

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