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