我使用C和openMPI在main()中并行化了一个算法;它工作得很完美,但现在我想将代码移到外部函数。
void my_parallel_function(int v[], int size, int rank)
{
if(rank==0)
{
MPI_Send(&v[0], 5, MPI_INT, 1, 1, MPI_COMM_WORLD);
}
else
{
MPI_Recv(&v[0], 5, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD,&status);
printf("value of item 1: %d", v[0]);
}
}
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[100];
if (rank==0)
{
my_parallel_function(vect, size, rank);
}
MPI_Finalize();
return 0;
}
上述代码仅用于说明我想要做的事情。我可以从控制台运行我的代码但是没有响应,它只是挂起。
有什么想法吗?非常感谢!
答案 0 :(得分:2)
调用您的函数时出现问题。您应该让所有MPI进程调用该函数。 您正确处理了函数中的发送和接收。(由@xeroqu指出)
在您当前的代码中,只有主进程调用该函数并发送数据,并且没有其他进程到达MPI_Recv,因此它应该挂起!
只需删除主广告中的if (rank==0)
即可。
<强>更新强>
看看以下代码。我做了两处改动。首先,我致电my_parallel_function
为所有队伍。其次,我将数据从主节点发送到所有其他节点(不只是一个)。
所以所有其他节点都会收到一些数据而不会阻塞。
#include <mpi.h>
#include <stdio.h>
void my_parallel_function(int v[], int size, int rank)
{
if(rank==0)
{
int i;
for( i=1; i<size; i++ )
MPI_Send(&v[0], 5, MPI_INT, /*Destination:*/i, 1, MPI_COMM_WORLD);
}
else
{
MPI_Status status;
MPI_Recv(&v[0], 5, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status);
printf("value of item 1: %d\n", v[0]);
}
}
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[100];
my_parallel_function(vect, size, rank);
MPI_Finalize();
return 0;
}
答案 1 :(得分:0)
除了saeedn的回答,您的MPI_Send()
似乎只会将数据从rank0
发送到rank1
。所有其他进程(rank0
除外)执行MPI_Recv
并等待。由于没有进程向这些进程发送数据,这也可能导致程序挂起。