实际上MPI_Waitall是如何工作的

时间:2011-08-22 14:53:24

标签: c++ c mpi

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

中的此语句相矛盾
  

MPI_Waitall的无错执行(count,array_of_requests,   array_of_statuses)与执行的效果相同   MPI_Wait(& array_of_request [i],& array_of_statuses [i]),for   i = 0,...,count-1,以任意顺序排列。

#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();
}

P.S。主要定义看起来很奇怪。返回值丢失。它是史前的C还是错字?

1 个答案:

答案 0 :(得分:5)

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

是的,缺少的return语句是错误的;但是有些编译器只是在main()中发出了忽略return语句的警告。此外,代码的史前性可以在参数的K&amp; R样式声明中看到。