2016-05-06 10 views
2

MPI_Recv関数に一連のタグを指定することは可能ですか?MPIタグのセット

私のシナリオ:

私は同時にMPI_RECV機能を実行する複数のスレッドを持つアプリケーションで働いています。私はmpiタグを使ってメッセージを受け取るスレッドを制御するつもりです。しかし、メッセージがdata_messagestop_messageであるかどうかを制御する必要もあります。

したがって、MPI_Recvにタグのセットを定義することは可能ですか? 意味的には、「タグ0または1のメッセージを受信する」、または「タグ10または11を使用してメッセージを受信する」などです。複数の値でなければなりません。

このアプローチを使用すると、stop_messageとしてなthread_id * 2としてdata_messageなthread_id * 2 + 1タグを使用することも可能です。

答えて

1

私はむしろ空のメッセージ(MPI_Send(count = 0))を使用してケースの停止条件を通知します。一致するメッセージがMPI_Probe(tag = thread_id)であるのを待ってから、返されたステータスオブジェクトにMPI_Get_countを使用してメッセージサイズを判断してください。それがゼロになると、処理ループを中断します。

別のオプションは、各スレッドが別個のコミュニケータで通信するようにすることです。 MPI_Comm_dupを使用して、MPI_COMM_WORLDの複製の配列を作成し、次にスレッドicomms[i]で通信させます。 MPI_Recv(tag = MPI_ANY_TAG, comm = comms[i])を使用して、メッセージを任意のタグと一致させることができます。これはスレッド固有のものです。送信側では、のランクの宛先に対処するにはMPI_Send(rank = dest, comm = comms[i])を使用してください。

1

特定のタグセットに一致する直接的な機能はありません(MPI_TAG_ANYは非特異性のため不適切です)、同じ目的を達成する方法があります。照合したいタグごとに1つずつ、各スレッドに2つのMPI_Irecvリクエストを投稿してください。次に、MPI_waitanyまたはMPI_Testanyを入力してください。

+2

'MPI_Testany'と' MPI_Waitany'は非決定論のソースです。前の_data_message_の受信が何らかの形で保証される前にOPが_stop_message_が送信されないことをOPが保証できる場合にのみ機能します。 –

+1

それは良い点です。注文セマンティクスは、異なる受信時に異なる指定されたタグ間で役立たないので、私の提案は実際に一致するメッセージのうちの1つまたは2つにしか依存しません。 – Novelocrat