8

関数を使用mpi_send/receiveするとどうなりますか?つまり、この通信は、送受信したい変数の値またはアドレスによって行われます(たとえば、プロセス0は変数「a」をプロセス1に送信します。プロセス0は、変数「a」またはアドレスの値を正確に送信します。 「a」の)。また、通信に派生データ型を使用するとどうなりますか?

4

3 に答える 3

23

かなりの魔法が舞台裏で起こります。


まず、予期しないメッセージキューがあります。受信者が電話をかけるMPI_Send前に送信者が電話をかけるとMPI_Recv、MPIは受信者のメモリのどこにメッセージが送信されているかを知りません。この時点で2つのことが起こる可能性があります。メッセージが短い場合は、受信側の一時バッファにコピーされます。受信者が呼び出すMPI_Recvと、最初に一致するメッセージがすでに到着しているかどうかを確認し、到着している場合は、データを最終的な宛先にコピーします。そうでない場合は、ターゲットバッファに関する情報がキューに保存されるためMPI_Recv、メッセージの到着時に一致させることができます。で予期しないキューを調べることができますMPI_Probe

メッセージがしきい値よりも長い場合、メッセージのコピーに時間がかかりすぎます。代わりに、送信者と受信者は、ある種のランデブープロトコルを使用してハンドシェイクを実行し、メッセージが送信される前にターゲットがメッセージを受信する準備ができていることを確認します。これは、InfiniBandのような高速ネットワークでは特に重要です。


通信ランクが同じマシン上にある場合、通常、データ転送は共有メモリを介して行われます。MPIランクは独立したプロセスであるため、互いのメモリにアクセスすることはできません。代わりに、同じノード上のMPIプロセスが共有メモリ領域を設定し、それを使用してメッセージを転送します。したがって、メッセージの送信には、データの2回のコピーが含まれます。送信者はデータを共有バッファーにコピーし、受信者はデータを独自のアドレス空間にコピーします。これには例外があります。MPIライブラリがKNEMなどのカーネルモジュールを使用するように構成されている場合、メッセージはOSカーネルの宛先に直接コピーできます。ただし、このようなコピーにはシステムコールのペナルティが発生します。カーネルを介してコピーすることは、通常、大きなメッセージに対してのみ価値があります。Catamountなどの特殊なHPCオペレーティングシステムは、これらのルールを変更できます。


集合的な操作は、送信/受信の観点から実装することも、完全に別個の最適化された実装にすることもできます。集合的な操作のためにいくつかのアルゴリズムを実装するのが一般的です。MPIライブラリは、メッセージのサイズとコミュニケータに応じて、実行時にどちらを使用して最高のパフォーマンスを実現するかを決定します。


優れたMPI実装は、余分なコピーを作成せずに派生データ型を転送しようと非常に懸命に試みます。データ型内のメモリのどの領域が隣接しているかを把握し、それらを個別にコピーします。ただし、場合によっては、MPIは、メッセージを連続させるために舞台裏でMPI_Packを使用することにフォールバックし、メッセージを転送して解凍します。

于 2012-06-01T15:59:50.380 に答える
6

アプリケーション・システム・プログラマーが懸念する必要がある限り、これらの操作はデータのアドレスではなく、データを送受信します。MPIプロセスはアドレス空間を共有しないため、プロセス0のアドレスはプロセス1の操作には意味がありません。プロセス1がプロセス0のアドレスのデータを必要とする場合、プロセス0からデータを取得する必要があります。 MPI-2で発生した片側通信がこの状況に重大な影響を与えること。

内部で行われていること、MPIライブラリの開発者からの見解は異なる可能性があり、確かに実装に依存します。たとえば、共有メモリマシンで適切に記述されたMPIライブラリを使用している場合は、システム周辺のアドレス位置にポインタを送信することでメッセージパッシングを実装できます。しかし、これはコーナーケースであり、最近はあまり見られません。

于 2012-06-01T13:03:04.477 に答える
1

mpi_send送信するデータを保持しているメモリにアドレスを指定する必要があります。そのメモリを再利用するために保存されている場合にのみ返されます(これは、通信をブロックしないことで回避できます)。

同様に、mpi_recv受信するデータをコピーできる十分なメモリのアドレスを指定する必要があります。データがそのバッファに受信された場合にのみ返されます。

MPIがそれをどのように行うかは別の問題であり、動作するMPIプログラムを作成するために(ただし、効率的なプログラムを作成するために)それについて心配する必要はありません。

于 2012-06-01T13:06:37.973 に答える