C OpenMPI将永远等待
当我执行这段代码时,我没有任何响应,它总是在等待,进程1正在向根进程发送数据,但根进程没有接收到数据(或者几乎就是我所想的)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_
#包括
#包括
#包括“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;imy_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;
}
}