fortran - MPI_Recv 覆盖不应访问的部分内存

标签 fortran mpi

在下面的代码中,如果我不将 xysize 声明为参数(我通常不能这样做),则 xysize 的值会发生更改。仅在 gfortran 4.7.2 和 OpenMPI 1.6 中使用 -O2 及更多优化时才会发生这种情况。这怎么可能?我找不到从 mpi.mod 导入的确切接口(interface),但 C 原型(prototype)明确指出 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

最佳答案

为了 future 的访客,我想我会回答这个问题,尽管上面的评论中都已经回答了。

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

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

关于fortran - MPI_Recv 覆盖不应访问的部分内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13049648/

相关文章:

编译具有 MPI 支持的 Valgrind

c - 使用 MPI 分散连续的二维数组

fortran - 如何包装 fortran write 语句

fortran - 如何在敏感模式下在 gfortran 中编译?

fortran - Fortran 中 COMPILER_OPTIONS() 应该返回什么?

c++ - 发送矩阵的行和列,MPI_SEND

c - 为什么我的 MPI 程序没有按预期打印

fortran - 如果我包含该库,fortran 的 'matmul' 会使用 MKL 吗?

list - 如何回答每行包含多个答案的交互式提示