C语言 需要 MPI 通信器来创建数据包的逻辑是什么?



需要通过MPI通信器来创建数据包的逻辑是什么?

https://www.mpich.org/static/docs/v3.2/www3/MPI_Pack.html

int MPI_Pack(
             const void *inbuf,
             int incount,
             MPI_Datatype datatype,
             void *outbuf,
             int outsize,
             int *position,
             MPI_Comm comm   /*********HERE*****/
            )

从理论上讲,人们可以用信息填充缓冲区,而不需要知道数据被发送到哪里。这是否意味着生成的数据包格式取决于通信器的某些特性?哪一个?

那里有冗余,如果一个人打包一个通信器并使用另一个通信器发送数据包(缓冲区(会发生什么?

#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
    int rank, size;
    int i;
    char c[100];
    char buffer[110];
    int position = 0;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    if (size < 2)
    {
        printf("Please run with 2 processes.n");fflush(stdout);
        MPI_Finalize();
        return 1;
    }
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0)
    {
        for (i=0; i<100; i++)
            c[i] = i;
        i = 123;
        MPI_Pack(&i, 1, MPI_INT, buffer, 110, &position, MPI_COMM_WORLD);
        MPI_Pack(c, 100, MPI_CHAR, buffer, 110, &position, MPI_COMM_WORLD);
        MPI_Send(buffer, position, MPI_PACKED, 1, 100, MPI_COMM_WORLD);
    }
    if (rank == 1)
    {
        MPI_Recv(buffer, 110, MPI_PACKED, 0, 100, MPI_COMM_WORLD, &status);
        MPI_Unpack(buffer, 110, &position, &i, 1, MPI_INT, MPI_COMM_WORLD);
        MPI_Unpack(buffer, 110, &position, c, 100, MPI_CHAR, MPI_COMM_WORLD);
        printf("i=%dnc[0] = %dn...nc[99] = %dn", i, (int)c[0], (int)c[99]);fflush(stdout);
    }
    MPI_Finalize();
    return 0;
}

如果您的通信器的所有 MPI 任务都具有相同的架构,那么打包/解包非常简单。现在,如果同一通信器中的 MPI 任务在不同的架构上运行(例如 x86_64 和 sparcv9、不同的字节序、不同的MPI_LONG_DOUBLE编码等(,那么数据必须以中性格式打包,以便任何任务都可以解码相同的打包缓冲区(。

来自 MPI 3.1 标准页面 133

comm 参数是随后将用于发送打包消息的通信器。

因此,您的第二个问题的答案(如果一个通信器打包并使用不同的通信器发送数据包(缓冲区(会发生什么(是关于 MPI 标准的非法程序具有未定义的行为。

最新更新