MPI_Recv会覆盖它不应访问的部分内存

时间:2012-10-24 12:54:50

标签: fortran mpi

在下面的代码中,如果我没有将它声明为参数(我通常不能这样做),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

1 个答案:

答案 0 :(得分:4)

为了未来的访问者,我想我会回答这个,尽管在上面的评论中都有答案。

据我所知,如果您的程序运行正常,则无法在调用MPI_Recv时更改该参数的值(“count”)。

您的论据status太小,它应该是一个数组status(MPI_STATUS_SIZE),并且您正在获得缓冲区溢出 - 这通常会导致分段错误,但有时(取决于如何编译器将变量打包在内存中,它可能导致这样的搞笑行为。