我注意到MPI_Send和MPI_Recv缓冲区大小有些奇怪,我无法理解。文档说这些函数的count
参数描述了 datatype
类型的 :
int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest,
int tag, MPI_Comm comm);
count [in]发送缓冲区中的元素数量(非负整数)
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Status *status);
count [in]接收缓冲区中的最大元素数(整数)
假设我们有2个进程,第一个(根)进程分配一个 n 整数数组并用一些数据填充
int* temp = (int*) malloc(n * sizeof(int));
for (int i = 0; i < n; i++) temp[i] = ...;
然后将其发送到rank = 1的第二个进程。
MPI_Send(temp, n, MPI_INT, 1, 0, MPI_COMM_WORLD);
第二个进程接收 n 整数数组。
MPI_Recv(temp, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_INGNORE);
但是在MPI_Recv之后,temp
数组被截断了。当我将count
参数从n
更改为n * sizeof(int)
时,我收到了正确的数组。但n * sizeof(int)
描述了缓冲区大小(以字节为单位),而不是文档中所说的元素。这是一种常见的行为还是一种简单的误解?附:我在Windows 7上使用MPICH2 x86作为MPI实现和32位VS08。
答案 0 :(得分:2)
根据
https://www.open-mpi.org/doc/v1.8/man3/MPI_Recv.3.php,
count参数保存缓冲区中的元素数。
计数
要接收的最大元素数(整数)。
必须通过乘以元素数(count)和每个元素的大小(由MPI_Datatype类型的常量给出)来计算字节数。