4

我注意到 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)以字节为单位描述缓冲区大小,而不是文档中所说的元素。这是一种普遍的行为还是一个简单的误解?PS 我在 Windows 7 上使用 MPICH2 x86 作为 MPI 实现和 32 位 VS08。

4

1 回答 1

2

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

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

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

于 2017-09-07T08:39:42.677 回答