在openMpi中并行化一个函数?

时间:2013-11-12 00:22:15

标签: c openmpi

我使用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;
}

上述代码仅用于说明我想要做的事情。我可以从控制台运行我的代码但是没有响应,它只是挂起。

有什么想法吗?非常感谢!

2 个答案:

答案 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并等待。由于没有进程向这些进程发送数据,这也可能导致程序挂起。