当我执行此代码时,我没有响应,它等待永远,进程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的新手,如何解决这个问题?
非常感谢!
答案 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从标准输入读取mpiexec
/ mpirun
的标准输入和输出。