2

FAQ#20は言う:

v1.1以降、Open MPIでは、C、C ++、およびFortranデータ型のサイズが、MPI_BOOLおよびMPI_LOGICALで表される型を除いて、単一の並列アプリケーション内のすべてのプラットフォームで同じである必要があります。これらの型のプロセス間のサイズの違い適切に処理されます。単一のMPIジョブ内のプロセス間のエンディアンの違いは、適切かつ自動的に処理されます。

v1.1より前のバージョンでは、OpenMPIにはデータサイズやエンディアンの異質性のサポートは含まれていませんでした。

MPI_UNSIGNED_LONGは、すべてのホストで32ビット、またはすべてのホストで64ビットでなければならないという意味ですか?私のクラスターは、32ビットと64ビットのLinuxサーバーで構成されています。それを保証しlongunsigned longすべてのホストで同じサイズになるようにするための最良の方法は何ですか?たぶん私は使用する必要がintあり、「長い長い」のみを使用する必要がありますか?これらは、すべてのホストでそれぞれ32ビットと64ビットです。使用しない限り、データサイズに一貫性がなくても大丈夫ですか?

ありがとうございました。

4

2 に答える 2

3

OpenMPIデータ型は、アーキテクチャに関係なく同じである必要があります。たとえば、aMPI_UNSIGNED_LONGは32ビット、anMPI_UNSIGNED_LONG_LONGは64ビットとして定義されています(たとえば、http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report.pdf、433ページを参照してください)。MPI_UNSIGNED_LONG4バイトと定義されています)。

MPI仕様にはさらにMPI_INT64_T友人がいるため、当て推量は必要ありません。

于 2011-08-23T17:32:34.407 に答える
1

MPI1.1は少し古いことに注意してください。MPI 1.1を使用する必要がある場合はわかりませんが、MPI 2を使用できる場合は、MPI2.2標準のセクション3.3を参照してください。私の理解では、たとえばMPI_UNSIGNED_LONGがすべてのホストで同じサイズ(同じバイト数)である必要はありません。送信/受信操作の場合、MPIデータ型は特定のサイズとして定義されていません。これらは、CまたはFortranの特定のデータ型に対応するように定義されています。したがって、たとえばMPI_UNSIGNED_LONGは、Cのunsigned long intに対応します(表3.2)。Cはunsignedlongintの特定のサイズ(C99では少なくとも32ビットであること)を保証しないため、MPIも保証しません。

これをバックアップするために、標準の38ページから直接引用しています。

[...]送信側と受信側が異なる環境で実行される場合、送信バッファーからフェッチされた10個の実数値は、受信バッファーに格納される前に、受信側サイトで実数の表現に変換されます。送信バッファからフェッチされた実数要素の数は、受信バッファに格納された実数要素の数と同じですが、格納されたバイト数は、ロードされたバイト数と同じである必要はありません。たとえば、送信者は4バイト表現を使用し、受信者は実数に対して8バイト表現を使用できます。

433ページの表13.2で定義されているサイズは、「external32」データ表現(ファイルの相互運用性のため)にのみ有効であり、私が知る限り、他の場所では有効ではありません。

于 2011-08-23T20:18:29.827 に答える