2013-08-21 12 views
7

MPI3.0近傍集合通信が導入されました。 そして、それらのうちの2つ(MPI_NEIGHBOR_ALLTOALLWおよびMPI_INEIGHBOR_ALLTOALLW)の変位(sdisplsおよびrdispls)は、const MPI_Aintの配列です。同じであるが集合的な関数(MPI_ALLTOALLWおよびMPI_ALLTOALLW)の定義とは逆に、配列はconst intと定義されています。MPI_(I)NEIGHBOR_ALLTOALLW()対MPI_(I)ALLTOALLW()内のMPI_Aint

2.5.6アドレス

いくつかのMPI手続きは 呼び出しで絶対アドレスを表すアドレス引数を使用します。

はまた、MPI規格v3.0のはMPI_Aintについて言っている(16ページ)を考慮しますプログラム。このような引数のデータ型は、CではMPI_Aint、Fortranでは INTEGER(KIND = MPI_ADDRESS_KIND)です。これらの型は同じ幅の を持っていなければならず、ある言語のアドレス値 が変換せずに別の言語に直接渡されるように同じ方法でアドレス値をエンコードする必要があります。アドレス範囲の開始を示すMPI定数 MPI_BOTTOMがあります。

存在する場合、私はまだ、ポイントを取得していない、intMPI_Aint間(MPI_Aintが負にすることはできませんということ以外に)違い!

答えて

7

MPI_Aintは、メモリアドレスを保持できるポータブルCデータ型であり、通常のintよりも大きい可能性があります。 MPIフォーラムの方針は、既存のMPI呼び出しの署名を変更しないことです(既存のアプリケーションを破る可能性があるため - here参照)。むしろ、古いものよりも新しいものが導入されています。その根拠は、intがLP64の64ビットアーキテクチャが普及する前にうまく動作していたことです。intは、単一のプロセスの仮想アドレス空間全体に対処するために使用できなくなりました。この実現後、MPI_AintまたはMPI_Count(大整数型)の代わりにintを使用する新しいバージョンのMPIコールがあります。たとえば、MPI_Get_count_xMPI_Get_countに優先し、intの代わりにMPI_Countを使用します。この点MPI_Alltoallw

は古いコール(それはMPI-2.0から来ている)であるとMPI_(I)Neighbor_alltoallwは新しいもの(それはMPI-3.0に付属している)であり、それは、アドレスの種類を使用しているが、それは、intオフセットを使用して、その署名を保持しますメモリ内のどこにでも配置されたデータを扱うことができます。

同じことがFortranバインディングに適用されます。

+0

あなたの答えとsizeof(MPI_Aint)が8のとき、感謝します:) p.s:なぜこの説明が標準ではないのですか? – Nicola

+1

通常、このようなことは[MPI Forum](http://www.mpi-forum.org/)の公開メーリングリストとディスカッションフォーラムで議論されています。 –

+1

MPI標準は、時には現れても、ユーザガイドではありません。説明については、「MPIの使用」を参照してください。 – Jeff

関連する問題