2

在下面的代码中xysize,如果我不将其声明为参数(我通常不能这样做),则它的值会发生变化。它只发生在 gfortran 4.7.2 和 OpenMPI 1.6 中的优化 -O2 和更多。这怎么可能?我找不到确切的接口,我从中导入mpi.mod,但 C 原型清楚地表明它count是按值传递的,因此它不能改变。

     write(*,*) im,"receiving from",image_index([iim,jim,kim+1]),"size",&
      size(D%A(D%starti:D%endi,D%startj:D%endj,D%endk)),xysize

    call MPI_RECV(D%A(D%starti:D%endi,D%startj:D%endj,D%endk+1),xysize , MPI_REAL, image_index([iim,jim,kim+1])-1,&
           5000, comm, status, ierr)

    write(*,*) im,"received size",&
      size(D%A(D%starti:D%endi,D%startj:D%endj,D%endk)),xysize

输出:

1 receiving from           2 size        4096        4096
1 received size        4096        5000
4

1 回答 1

5

为了将来的访问者,我想我会回答这个问题,即使上面的评论都回答了。

据我所知,如果您的程序运行正常,则无法在调用MPI_Recv.

您的参数status太小,它应该是一个数组status(MPI_STATUS_SIZE),并且您遇到了缓冲区溢出——这通常会导致分段错误,但有时(取决于编译器如何将变量打包到内存中),它可能会导致像这样的有趣行为。

于 2012-10-25T12:37:10.937 回答