0

我有一个在 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_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;
}

上面的代码只是为了说明我想做的事情。我可以从控制台运行我的代码,但没有响应,它只是挂起。

有任何想法吗?非常感谢!

4

2 回答 2

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;
}
于 2013-11-12T05:14:13.160 回答
0

除了 saeedn 的回答之外,您MPI_Send()似乎只从rank0to发送数据rank1。所有其他进程(除了rank0)执行MPI_Recv并等待。由于没有进程向这些进程发送数据,这也可能导致您的程序挂起。

于 2013-11-12T13:41:22.430 回答