MPI_Send/MPI_Recv:元素数量还是缓冲区大小?

3

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


1
你正确地阅读了文档,并且已发布的 Send/Recv 行没有问题,这表明问题出在其他地方。 temp 和 n 在两个任务中都正确定义了吗? - Jonathan Dursi
感谢您的评论。是的,在两个任务中n值相等,temp数组已经正确定义。 - Symbolist
1
好的,你需要提供更多的代码,因为从你提供的内容中问题并不明显。像往常一样,一个简单、自包含、可复现的示例是最好的。 - Jonathan Dursi
1个回答

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

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

需要通过将元素数量(count)和每个元素的大小(由MPI_Datatype类型的常量给出)相乘来计算字节数。请注意保留HTML标签,我会尽力使翻译更加通俗易懂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接