在下面的代码中,如果我没有将它声明为参数(我通常不能这样做),xysize
的值会发生变化。它只发生在gfortran 4.7.2和OpenMPI 1.6中的优化-O2和更多。这怎么可能?我无法找到从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
答案 0 :(得分:4)
为了未来的访问者,我想我会回答这个,尽管在上面的评论中都有答案。
据我所知,如果您的程序运行正常,则无法在调用MPI_Recv
时更改该参数的值(“count”)。
您的论据status
太小,它应该是一个数组status(MPI_STATUS_SIZE)
,并且您正在获得缓冲区溢出 - 这通常会导致分段错误,但有时(取决于如何编译器将变量打包在内存中,它可能导致这样的搞笑行为。