2012-10-24 72 views
1

的值在下面的代碼的xysize值得到改變,如果我不聲明它作爲一個參數(我一般不能做的)。它只會在gfortran 4.7.2和OpenMPI 1.6中優化-O2和更多。這怎麼可能?我無法找到確切的界面,我從mpi.mod導入,但C原型明確指出count是按值傳遞的,因此它不能更改。MPI_RECV改變計數

 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

我們的好奇心,你從'mpi_get_count得到什麼(狀況,MPI_REAL,N,IERR);打印*,n' - 我真的想知道你是否得到了一個緩衝區溢出導致有趣的行爲... – mgilson

+0

謝謝你的建議!問題顯然是在狀態聲明中,這是一個正常的標量整數。我不知道爲什麼它在'MPI_Recv'中編譯,因爲'MPI_Get_count'的接口檢查發現了這個問題。 –

+0

奇怪。我很高興它抓住了它。 'MPI_Recv'可能有一個聲明爲'integer status(*)'的接口,以便它可以接受標量或數組。這樣一來,'MPI_STATUS_IGNORE'可能是一個標量...好像'MPI_STATUS_SIZE'將是足夠小,它不會有問題,但是,我想,該庫是試圖將內存使用效率或東西...'MPI_Get_count'上另一方面不能接受'MPI_STATUS_IGNORE' ... – mgilson

回答

2

對於未來遊客的緣故,我想我會回答這個問題,即使這一切都在評論中回答以上。

據我所知,如果您的程序運行正常,您不能在調用MPI_Recv時更改該參數的值(「count」)。

你的論點status太小,它應該是一個數組status(MPI_STATUS_SIZE),和你得到一個緩衝區溢出 - 這通常會導致分段錯誤,但有時(取決於編譯器如何包裝變量在內存),它可能會導致這樣的有趣行爲。

+0

當堆棧變量用作調用參數並且沒有使用的指針被覆蓋/損壞(調用函數的堆棧框架中的返回地址是這樣的指針)時,通常會發生這種情況。 –

+2

@HristoIliev - 顯然你還沒有使用過我的一些代碼;-)。舊的F77風格的內存管理,其中一切都等同於一個大陣列,在傳遞給子例程時得到分區...... :) – mgilson

+0

嘿,這是2012年,我們有像GCC ...和餅乾:) –