MPI_Recv 覆盖它不应访问的部分内存 [英] MPI_Recv overwrites parts of memory it should not access

查看:19
本文介绍了MPI_Recv 覆盖它不应访问的部分内存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In the following code the value of xysize gets changed, if I do not declare it as a parameter (which I generally cannot do). It happens only with optimizations -O2 and more in gfortran 4.7.2 and OpenMPI 1.6. How is it possible? I cannot find the exact interface, that I import from mpi.mod, but the C prototype clearly states that count is passed by value, hence it cannot change.

     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

推荐答案

为了以后的访问者,我想我会回答这个问题,即使上面的评论都回答了.

For the sake of future visitors, I suppose I'll answer this even though it's all answered in the comments above.

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

As far as I'm aware, if your program is behaving properly, you cannot change the value of that parameter ("count") in a call to MPI_Recv.

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

Your argument status is too small, it should be an array status(MPI_STATUS_SIZE), and you're getting a buffer overflow -- This often results in a segmentation fault, but at times (depending on how the compiler packed the variables in memory), it can result in funny behavior like this.

这篇关于MPI_Recv 覆盖它不应访问的部分内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆