MPI_Recv更改count的值 [英] MPI_Recv changes the value of count

查看:154
本文介绍了MPI_Recv更改count的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  write(*,*)im,from from,image_index([iim,jim,kim + 1]), 大小,&安培; (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,状态,ierr)

写(*,*)im,收到大小,&
size(D%A(D%starti:D%endi,D%startj:D%endj,D%endk)),xysize

输出:

  1从2尺寸收到4096 4096 
1收到大小4096 5000


解决方案

为了未来的访问者,我想我会回答这个问题,即使它在上面的评论中都得到了回答。



就我所知,如果程序运行正常,则不能在调用<$ c时更改该参数的值(count) $ C> MPI_RECV 。

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


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

output:

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.

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.

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更改count的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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