2

MPIに、特定のプロセスのメッセージの可用性を通知する方法はありますか?現在、非同期MPI_Iprobeの後にMPI_Recvを使用してポーリングを使用しています。これは、プロセスが実行中の処理を停止し、このメソッドを時々呼び出す必要があることを意味します。信号/割り込みを介してメッセージの可用性について通知を受ける方法はありますか?別のオプションは、このポーリングを別のスレッドで実行することですが、CPU時間を消費するため、それが許容できるかどうかはわかりません。

    int poll(int& source,int& message_id) {
     int flag;
     MPI_Status mpi_status;
     MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,&flag,&mpi_status);
     if(flag) {
       message_id = mpi_status.MPI_TAG;
       source = mpi_status.MPI_SOURCE;
       return true;
     }
     return false;
    }

編集: MPI実装はポーリングを使用しているようですhttp://blogs.cisco.com/performance/polling-vs-blocking-message-passingprogress/

これに対する最善の解決策は、ブロッキングMPI_Probe()を使用してから、mpirun -n 2 --mca yield_when_idleを使用することです。これにより、メッセージが送信されるまでポーリングスレッドがブロックされます。ただし、一部のmpi実装にはmcaオプションがありません。

4

1 に答える 1

0

このようなメカニズムは、ポータブルな方法で直接利用することはできません。

スレッドMPI_Wait(またはそのフレーバー)を使用することも、さらに単純に使用することもできますMPI_Recv。ただし、メッセージを待機している間、MPI実装がCPUを消費しないという保証はありません。(ポーリングオーバーは実際に100%のCPUを消費することが保証されていMPI_Iprobeます。)MPIとスレッドにも注意してください。落とし穴があり、さまざまな動作モードがあります。

そもそもなぜそんなことをしたいのですか?たとえば、一方的な通信を使用するなど、あなたが行うことにはより良いメカニズムがあるかもしれません。

于 2013-02-27T21:48:43.703 に答える