Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在openMpi中并行化函数?_C_Openmpi - Fatal编程技术网

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_

我有一个在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;
}
上面的代码只是为了说明我想做什么。我可以从控制台运行代码,但是没有响应,它只是挂起


有什么想法吗?非常感谢

调用函数时出现问题。应该让所有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),请在此处检查: