2

次のコードでは、値を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
4

1 に答える 1

5

将来の訪問者のために、上記のコメントですべて回答されていますが、これに回答すると思います。

私の知る限り、プログラムが適切に動作している場合、 への呼び出しでそのパラメーター (「カウント」) の値を変更することはできませんMPI_Recv

引数statusが小さすぎstatus(MPI_STATUS_SIZE)ます。これは array である必要があり、バッファ オーバーフローが発生しています。これにより、セグメンテーション違反が発生することがよくありますが、(コンパイラが変数をメモリにどのようにパックしたかによって)、次のような結果になる可能性があります。こういうおかしな行動。

于 2012-10-25T12:37:10.937 に答える