1

Fortran の MPI_BCAST に問題があります。MPI_CART_CREATE ('COMM_NEW' など) を使用して新しいコミュニケーターを作成します。古いコミュニケーター (MPI_COMM_WORLD) を使用してルートからデータをブロードキャストすると、正常に動作します。しかし、作成したばかりの新しいコミュニケーターを使用すると、エラーが発生します。

[compute-4-15.local:15298] *** An error occurred in MPI_Bcast
[compute-4-15.local:15298] *** on communicator MPI_COMM_WORLD
[compute-4-15.local:15298] *** MPI_ERR_COMM: invalid communicator
[compute-4-15.local:15298] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)

COMM_NEW に関与するプロセッサから結果を取得し、上記のエラーも発生します。問題は、COMM_NEW に含まれていないが MPI_COMM_WORLD に存在する他のプロセッサにあると考えられます。どんな助けでも大歓迎です。COMM_NEW のプロセッサ数が全プロセッサ数より少ないためでしょうか。もしそうなら、合計よりも少ない一連のプロセッサ間でブロードキャストするにはどうすればよいですか。ありがとう。私のサンプルコードは次のとおりです。

!PROGRAM TO BROADCAST THE DATA FROM ROOT TO DEST PROCESSORS
PROGRAM MAIN
IMPLICIT NONE
INCLUDE 'mpif.h'
!____________________________________________________________________________________
!-------------------------------DECLARE VARIABLES------------------------------------
INTEGER :: ERROR, RANK, NPROCS, I
INTEGER :: SOURCE, TAG, COUNT, NDIMS, COMM_NEW
INTEGER :: A(10), DIMS(1)
LOGICAL :: PERIODS(1), REORDER
!____________________________________________________________________________________
!-------------------------------DEFINE VARIABLES-------------------------------------
SOURCE = 0; TAG = 1; COUNT = 10
PERIODS(1) = .FALSE.
REORDER = .FALSE.
NDIMS = 1
DIMS(1) = 6
!____________________________________________________________________________________
!--------------------INITIALIZE MPI, DETERMINE SIZE AND RANK-------------------------
CALL MPI_INIT(ERROR)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, NPROCS, ERROR)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, RANK, ERROR)
!
CALL MPI_CART_CREATE(MPI_COMM_WORLD, NDIMS, DIMS, PERIODS, REORDER, COMM_NEW, ERROR)

IF(RANK==SOURCE)THEN
DO I=1,10
  A(I) = I
END DO
END IF
!____________________________________________________________________________________
!----------------BROADCAST VECTOR A FROM ROOT TO DESTINATIONS------------------------

CALL MPI_BCAST(A,10,MPI_INTEGER,SOURCE,COMM_NEW,ERROR)

!PRINT*, RANK
!WRITE(*, "(10I5)") A

CALL MPI_FINALIZE(ERROR)

END PROGRAM
4

2 に答える 2

2

Wesley Bland の回答を詳しく説明し、エラー メッセージの明らかな不一致を明確にする。の MPI プロセスMPI_COMM_WORLDの数が、作成されたデカルト グリッドのプロセスの数より多い場合、一部のプロセスは新しいデカルト コミュニケーターのメンバーにならずMPI_COMM_NULL、無効なコミュニケーター ハンドルを取得します。集合通信操作を呼び出すには、有効なコミュニケーター間またはコミュニケーター内のハンドルが必要です。MPI_PROC_NULLポイントツーポイント操作で許可されている の使用とは異なり、集合呼び出しで無効なコミュニケーター ハンドルを使用するのは誤りです。最後のステートメントは、MPI 標準では明示的に記述されていません。代わりに、使用される言語は次のとおりです。

がイントラコミュニケータの場合comm... がインターコミュニケータの場合comm...

MPI_COMM_NULLはイントラ コミュニケーターでもインター コミュニケーターでもないため、定義された動作の 2 つのカテゴリのいずれにも該当せず、エラー状態になります。

通信エラーは何らかのコンテキスト (有効なコミュニケーターなど) で発生する必要があるため、Open MPIMPI_COMM_WORLDはエラー ハンドラーの呼び出しを代用するため、エラー メッセージには " *** on communicator MPI_COMM_WORLD" が表示されます。これは、実装されompi/mpi/c/bcast.cている の関連するコード セクションです。MPI_Bcast

if (ompi_comm_invalid(comm)) {
    return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, 
                               FUNC_NAME);
}
...
if (MPI_IN_PLACE == buffer) {
    return OMPI_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}

コードは、最初のチェック内でエラー ハンドラーをトリガーします。他のすべてのエラー チェックcommでは、代わりに (有効なコミュニケーター ハンドルであると判断されるため) が使用され、エラー メッセージは " *** on communicator MPI COMMUNICATOR 5 SPLIT FROM 0" のようになります。

于 2013-06-23T11:12:51.127 に答える
2

MPI_COMM_WORLD の Bcast について不平を言っていて、実際にはコードで実行していないため、質問の上部にあるエラーは下部のコードと一致しないと思います。

とにかく、ディメンションよりも多くのプロセスで実行している場合、一部のプロセスは COMM_NEW に含まれません。代わりに、MPI_CART_CREATE への呼び出しが戻ると、トポロジーを持つ新しいコミュニケーターの代わりに、COMM_NEW に対して MPI_COMM_NULL を取得します。Bcast を実行する前に、MPI_COMM_NULL の代わりに実際のコミュニケーターがあることを確認するためのチェックを行う必要があります (または、DIMS(1) を超えるすべてのランクが Bcast に入らないようにする必要があります)。

于 2013-06-22T15:07:36.750 に答える