MPI_RECV覆盖部分内存不应该访问MPI_RECV覆盖部分内存不应该访问(MPI_Recv ov

2019-05-12 09:03发布

在下面的代码的值xysize得到改变,如果我不声明它作为一个参数(我一般不能做的)。 它只会发生在gfortran 4.7.2和1.6的openmpi优化-02等。 这怎么可能? 我无法找到确切的界面,我从进口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

Answer 1:

对于未来游客的缘故,我想我会回答这个问题,即使它在评论中都回答以上。

据我所知,如果你的程序正常行为,你不能在一个呼叫改变参数的值(“计数”) MPI_Recv

你的论点status太小,它应该是一个数组status(MPI_STATUS_SIZE)和你得到一个缓冲区溢出-这通常会导致分段错误,但有时(取决于编译器如何包装变量在内存中) ,它会导致这样的滑稽行为。



文章来源: MPI_Recv overwrites parts of memory it should not access
标签: fortran mpi