2013-07-19 19 views
7

mpi_reducempi_in_placeを送信バッファとして呼び出しようとすると、クラッシュします。 Googleのトロールは、これがOMPI 1.3.3のMac OSで問題になっていることを明らかにしていますが、CentOSとOMPI 1.6.3(gfortran 4.4.6)を使用しています。場所mpi_reduceがOpenMPIでクラッシュする

次のプログラムがクラッシュ:

PROGRAM reduce 

    USE mpi 

    IMPLICIT NONE 

    REAL, DIMENSION(2, 3) :: buffer, gbuffer 

    INTEGER :: ierr, me_world 
    INTEGER :: buf_shape(2), counts 

    CALL mpi_init(ierr) 
    CALL mpi_comm_rank(mpi_comm_world, me_world, ierr) 

    buffer = 1. 
    IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer 

    buf_shape = SHAPE(buffer) 
    counts = buf_shape(1)*buf_shape(2) 

    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, mpi_real, mpi_sum, 0, mpi_comm_world, ierr) 
    IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer 

    CALL mpi_finalize(ierr) 

END PROGRAM reduce 

MPIエラーがある:

MPI_ERR_ARG: invalid argument of some other kind 

非常に有用ではありません。

mpi_reduceをどのように呼び出す必要がありますか?これは他のコンパイラ/ MPI実装でも機能しますか?

答えて

14

あなたは(太字テキストを参照してください)インプレース縮小操作がMPIでどのように動作するかの非常に重要な部分が欠落しています

コミュニケータがintracommunicatorあるとき、あなたは減らす操作を行うことができますイン(出力バッファが入力バッファとして使用されます)。 ルートプロセスsendbufの値に変数MPI_IN_PLACEを使用します。この場合、入力データは受信バッファからルートで取得され、そこで出力データに置き換えられます。

他のプロセスがまだMPI_IN_PLACE、 sendbuf として地元のバッファをしませ供給する必要があります。

IF (me_world == 0) THEN 
    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
ELSE 
    CALL mpi_reduce(buffer, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
END IF 

あなたが安全にroot以外のプロセスで sendbufとrecvbuf両方としてbufferを渡すことができますMPI_REDUCEはこれらのプロセスでrecvbufに書き込まれないためです。

+0

ありがとうございました。私は 'MPI_IN_PLACE'のドキュメントを誤って解釈しました。集合的なコミュニケーションは、全く同じ議論ですべてのプロセスによって呼び出されなければならないと思っていました。 – Yossarian

+0

本当によろしいですか?私の生産コードを調べたところ、間違った使い方の例が多く、これまでに問題は発生していません。 –

+0

@VladimirFには、 'MPI_IN_PLACE'を' MPI_ALLTOALL'や 'MPI_ALLREDUCE'のようなすべてのランクで送信バッファとして指定しなければならないいくつかの集合的な操作があります。標準では、各操作の適切な使用方法を個別に示しています。 –

関連する問題