我注意到MPI_Send和MPI_Recv缓冲区大小的奇怪现象,但我无法理解。文档说明这些函数的count
参数描述了datatype
类型的元素个数:
int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest,
int tag, MPI_Comm comm);
计数 [输入] 发送缓冲区中元素的数量(非负整数)。
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Status *status);
count [in] 接收缓冲区中最大元素数量(整数)
假设我们有两个进程,第一个(根)进程分配了一个包含n个整数的数组,并填充了一些数据。
int* temp = (int*) malloc(n * sizeof(int));
for (int i = 0; i < n; i++) temp[i] = ...;
然后将其发送给排名为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。