C MPI多动态数组传递

Shm*_*opy 1 mpi

我正在尝试ISend()两个数组:arr1,arr2和一个n大小为的整数arr1,arr2.我从这篇文章中了解到发送包含所有三个结构的结构不是一个选项,因为n只在运行时才知道.显然,我需要n先接收,否则接收过程将不知道要接收多少元素.在不使用blokcing的情况下实现这一目标的最有效方法是什么Send()

Hri*_*iev 6

发送数组的大小是冗余的(并且效率低下),因为MPI提供了一种探测传入消息而不接收它们的方法,它提供了足够的信息以便正确分配内存.使用MPI_PROBE看起来很像的探测MPI_RECV,除了它不需要与缓冲区相关的参数.探测操作返回一个状态对象,然后可以查询可以从消息内容中提取的给定MPI数据类型MPI_GET_COUNT的元素数量,因此显式发送元素数量变得多余.

这是一个有两个等级的简单示例:

if (rank == 0)
{
    MPI_Request req;

    // Send a message to rank 1
    MPI_Isend(arr1, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &req);
    // Do not forget to complete the request!
    MPI_Wait(&req, MPI_STATUS_IGNORE);
}
else if (rank == 1)
{
    MPI_Status status;

    // Wait for a message from rank 0 with tag 0
    MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
    // Find out the number of elements in the message -> size goes to "n"
    MPI_Get_count(&status, MPI_DOUBLE, &n);
    // Allocate memory
    arr1 = malloc(n*sizeof(double));
    // Receive the message. ignore the status
    MPI_Recv(arr1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
Run Code Online (Sandbox Code Playgroud)

MPI_PROBE还接受通配符等级MPI_ANY_SOURCE和通配符标记MPI_ANY_TAG.然后,可以查询状态结构中的相应条目,以便找出实际的发送者等级和实际的消息标记.

探测消息大小的工作原理是每条消息都带有一个标题,称为信封.信封包括发送者的等级,接收者的等级,消息标记和通信者.它还包含有关总消息大小的信息.信封作为两个通信进程之间初始握手的一部分发送.