MPI_Send / MPI_Recv:元素数或缓冲区大小?

时间:2013-04-18 20:45:59

标签: c mpi

我注意到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。

1 个答案:

答案 0 :(得分:2)

根据
https://www.open-mpi.org/doc/v1.8/man3/MPI_Recv.3.php
count参数保存缓冲区中的元素数。

  

计数
  要接收的最大元素数(整数)。

必须通过乘以元素数(count)和每个元素的大小(由MPI_Datatype类型的常量给出)来计算字节数。