2

メッセージを渡すには、送信操作と受信操作のどのパラメーターが一致する必要があるかを判断しようとしています。

受信操作は、メッセージのソース、タグ、およびコミュニケーターと一致する (または包含する) 必要があることを理解しています。ただし、データ型が一致している必要がありますか?

たとえば、ランク 0 からの送信を照合できますか。

MPI_Send (send_buffer, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

ランク 1 での受信操作の場合:

MPI_Recv (recv_buffer, 4, MPI_BYTE, 0, 0, MPI_COMM_WORLD, status);

特に、送信の「カウント」は受信のカウントよりも少ないため、MPI に有効であることがわかっています。

ありがとう。

4

1 に答える 1

7

短い答えはイエスです。データ型は一致する必要がありますが、いくつかの注意点があります。

MPI_INTやなどのプリミティブ MPI データ型を使用する場合MPI_FLOAT、型は同一でなければなりません。唯一の例外はMPI_PACKEDで、これは他のどの型とも一致します。

派生データ型 (別名ユーザー定義データ型) を使用する場合、状況は少し複雑になります。一般的な MPI データ型は、派生データ型を構成する基本的な言語データ型を定義する型シグネチャと、これらの基本要素がメモリ内のどこに存在するかを定義する一連のバイトディスプレースメントの 2 つから構成されます。両方のシーケンスの組み合わせは、データ型の型マップと呼ばれます。プリミティブ MPI データ型は、変位が 0 の型シグネチャに単一の基本データ型を持つ一般的なデータ型の特定のケースです。たとえばMPI_INT、次の型マップがあります{ (int, 0) }。送信操作と受信操作が一致するには、型シグネチャが両側で同じである必要がありますが、変位は異なる場合があります。たとえば、送信者MPI_Type_contiguousは 3 秒で構成される単一のオブジェクトを送信する可能性がありますが、受信者は任意の変位を持つ3 秒のタイプMPI_FLOATとしてこれを受信できます。送信者は 3 つの要素の配列を提供する場合もあります。たとえば、これでも同じ型シグネチャが生成されます。MPI_Type_indexedMPI_FLOATMPI_FLOATMPI_Send(buf, 3, MPI_FLOAT, ...)

型シグネチャは基本的なデータ型のみで構成されていることを強調しておきます。ユーザー定義データ型がプリミティブ MPI 型から直接作成されたか、他のユーザー定義データ型 (またはそれらの混合) から作成されたかは関係ありません。

例: 送信者は、 3秒と 2秒MPI_Type_structで構成される を定義します。レシーバーは、3 つの s (この type と呼びましょう) で構成される を定義し、別の 2 s ( type ) を定義し、次に1と 1で構成される を定義します。これらの 2 つのデータ型は、最終的に両方とも 3の後に 2 が続くため、一致します。MPI_INTMPI_FLOATMPI_Type_contiguousMPI_INTAMPI_Type_contiguousMPI_FLOATBMPI_Type_structABintfloat

于 2013-08-25T02:20:02.690 に答える