通过MPI_Send发送一个int数组

7

我是MPI的新手,想通过MPI_Send将一个int数组发送到另一个进程。

// Code example
int main(int argc, char ** argv)
{
    int * array;
    int tag=1;
    int size;
    int rank;
    MPI_Status status;
    MPI_Init (&argc,&argv);
    MPI_Comm_size (MPI_COMM_WORLD,&size);
    MPI_Comm_rank (MPI_COMM_WORLD,&rank);
    
    if (rank == 0)
    {
        array = malloc (10 * sizeof(int)); // Array of 10 elements
        if (!array) // error checking
        {
            MPI_Abort (MPI_COMM_WORLD,1);
        }
        MPI_Send(&array,10,MPI_INT,1,tag,MPI_COMM_WORLD);
    }
    
    if (rank == 1)
    {
        MPI_Recv (&array,10,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
        // more code here
    }
    
    MPI_Finalize();
    // More code here

我想问三个问题:

  1. 这是将数组发送到另一个进程秩的安全方式吗?
  2. 这是语法上正确使用 MPI_Send()MPI_Recv() 吗?
  3. 有没有更好的方法来发送和接收数组而不会遇到太多麻烦?

非常感谢您的帮助。


1
我建议在开始使用MPI之前,重新学习C语言指针的基础知识。 - Zulan
1
MPI_Recv() 不会为您分配数组。MPI_Send()MPI_Recv() 都需要指向数据的指针,而不是指向数据指针的地址。 - Gilles Gouaillardet
1个回答

13
如果你要动态分配数组,发送和接收应该是这样的:
MPI_Send(array,10,MPI_INT,1,tag,MPI_COMM_WORLD);
以及
MPI_Recv(array,10,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
(请注意,数组是array而不是&array)
如评论中所建议的,你对MPI的理解似乎很好,但是刷新一下C指针的使用可能会有所帮助。
编辑:正如Gilles所提到的,所有接收数据到数组中的进程也需要为它们分配内存。(也许先发送数据的大小,这样接收方就知道要分配多大的数组?然而还有其他方法来实现这个,这只是一个简单的说明)

6
接收器上也必须分配array - Gilles Gouaillardet
好的喊声,Gilles! - HCF3301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接