MPI_Recv更改count的值 [英] MPI_Recv changes the value of 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屋!