gpt4 book ai didi

c++ - MPI_Waitall 是如何工作的

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:14 24 4
gpt4 key购买 nike

是否this example矛盾the manual ?手册指出请求数组和状态数组的大小必须相同。更准确地说,两个数组的长度至少应与 count 参数指示的一样长。然而,在下面的示例中,状态数组大小为 2,而不是 4。此外,该示例与手册中的此声明相矛盾

The error-free execution of MPI_Waitall(count, array_of_requests, array_of_statuses) has the same effect as the execution of MPI_Wait(&array_of_request[i], &array_of_statuses[i]), for i=0,...,count-1, in some arbitrary order.

#include "mpi.h"
#include <stdio.h>

int main(argc,argv)
int argc;
char *argv[]; {
int numtasks, rank, next, prev, buf[2], tag1=1, tag2=2;
MPI_Request reqs[4];
MPI_Status stats[2];

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

prev = rank-1;
next = rank+1;
if (rank == 0) prev = numtasks - 1;
if (rank == (numtasks - 1)) next = 0;

MPI_Irecv(&buf[0], 1, MPI_INT, prev, tag1, MPI_COMM_WORLD, &reqs[0]);
MPI_Irecv(&buf[1], 1, MPI_INT, next, tag2, MPI_COMM_WORLD, &reqs[1]);

MPI_Isend(&rank, 1, MPI_INT, prev, tag2, MPI_COMM_WORLD, &reqs[2]);
MPI_Isend(&rank, 1, MPI_INT, next, tag1, MPI_COMM_WORLD, &reqs[3]);

{ do some work }

MPI_Waitall(4, reqs, stats);

MPI_Finalize();
}

附言main 的定义看起来很奇怪。缺少返回值。是史前C还是错字?

最佳答案

是的,这个例子与手册相矛盾。如果将示例与 Fortran 版本进行比较,您会发现 Fortran 版本是正确的,因为状态数组足够大(奇怪的是,它是一个二维数组,但由于隐式接口(interface)和存储关联,它可以被视为大小为 MPI_STATUS_SIZE * 2 的一维数组大于 4,前提是 MPI_STATUS_SIZE 大于 1(在我的系统上为 5)。

是的,缺少返回语句是一个错误;然而,一些编译器只是发出警告以省略 main() 中的 return 语句。此外,从参数的 K&R 样式声明中可以看出代码的史前性。

关于c++ - MPI_Waitall 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7149314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com