需要 MPI 通信器创建数据包的逻辑是什么?
What is the logic of needing an MPI communicator to create a packet?
创建数据包需要通过MPI communicator是什么逻辑?
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=%d\nc[0] = %d\n...\nc[99] = %d\n", i, (int)c[0], (int)c[99]);fflush(stdout);
}
MPI_Finalize();
return 0;
}
如果您的通信器的所有 MPI 任务都具有相同的体系结构,那么 packing/unpacking 非常简单。
现在,如果同一通信器 运行 中的 MPI 任务在不同的架构上(例如 x86_64 和 sparcv9,不同的字节顺序,MPI_LONG_DOUBLE
的不同编码等等),那么数据必须被打包中性格式,以便任何任务都可以解码相同的打包缓冲区)。
来自 MPI 3.1 标准第 133 页
The comm argument is the communicator that will be subsequently used for sending the packed message.
所以你的第二个问题的答案(如果一个人用一个通信器打包并用另一个通信器发送数据包(缓冲区)会发生什么)是一个关于 MPI 标准的非法程序具有未定义的行为。
创建数据包需要通过MPI communicator是什么逻辑?
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=%d\nc[0] = %d\n...\nc[99] = %d\n", i, (int)c[0], (int)c[99]);fflush(stdout);
}
MPI_Finalize();
return 0;
}
如果您的通信器的所有 MPI 任务都具有相同的体系结构,那么 packing/unpacking 非常简单。
现在,如果同一通信器 运行 中的 MPI 任务在不同的架构上(例如 x86_64 和 sparcv9,不同的字节顺序,MPI_LONG_DOUBLE
的不同编码等等),那么数据必须被打包中性格式,以便任何任务都可以解码相同的打包缓冲区)。
来自 MPI 3.1 标准第 133 页
The comm argument is the communicator that will be subsequently used for sending the packed message.
所以你的第二个问题的答案(如果一个人用一个通信器打包并用另一个通信器发送数据包(缓冲区)会发生什么)是一个关于 MPI 标准的非法程序具有未定义的行为。