C 在openMpi中并行化函数?
我有一个在main()中使用C和openMPI并行的算法;它工作得很完美,但现在我想把代码移到一个外部函数C 在openMpi中并行化函数?,c,openmpi,C,Openmpi,我有一个在main()中使用C和openMPI并行的算法;它工作得很完美,但现在我想把代码移到一个外部函数 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_
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;
}
上面的代码只是为了说明我想做什么。我可以从控制台运行代码,但是没有响应,它只是挂起
有什么想法吗?非常感谢 调用函数时出现问题。应该让所有MPI进程调用该函数。您在函数中正确地处理了发送和接收。(由@xeroqu指出) 在您当前的代码中,只有主进程调用函数并发送数据,没有其他进程到达MPI_Recv,因此它应该挂起 只需删除主菜单中的if(rank==0) 更新 看看下面的代码。我做了两个改变。首先,我调用
my_parallel_函数
对于所有级别。其次,我将数据从主节点发送到所有其他节点(而不仅仅是一个节点)。
因此,所有其他节点都会接收一些数据,并且不会阻塞
#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;
}
#包括
#包括
void my_parallel_函数(int v[],int size,int rank)
{
如果(秩==0)
{
int i;
对于(i=1;i除了saeedn的答案外,您的MPI_Send()
似乎只将数据从rank0
发送到rank1
。所有其他进程(除了rank0
)执行MPI\u Recv
并等待。由于没有进程向这些进程发送数据,这也可能导致程序挂起。如果我删除if(秩==0)其他进程将向i/o输出一些信息,并将进入while和switch loop菜单。while和switch loop菜单?我在回答中添加了一个代码。查看是否有帮助。非常感谢,现在它工作正常,但现在我有另一个问题,原因是删除if(秩==0),请在此处检查: