OpenMPI永远等待着

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

#include  #include  #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的新手,怎么能解决这个问题?

非常感谢你!。

在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的标准输入和输出。

my_parallel_function仅在rank为0时调用。因此,当rank为1时,不会将任何内容发送到rank 0,并且它的MPI_Recv永远等待。 只需从你的main删除if