0

基本的に私はこのようなことを達成したいと思います:

Process 1
  Thread 1
    Receive X from process 2
  Thread 2
    Receive Y from process 2
Process 2
  Thread 1
    Send X to process 1
  Thread 2
    Send Y to process 1

MPIforC言語でpthreadsライブラリを使用します。
私はすでにPVMでそれを行いました、ここにソースコードがあります:
master.c:http :
//pastebin.com/wwEie7gn、slave.c:http: //pastebin.com/gfeCkcss
私がやろうとしたこと:
prog.c:http: //pastebin.com/tCVKN3fe
どういうわけかレシーバースレッドは何も受信しません。何が問題なのかわかりません。誰かが私にそれを行う適切な方法を教えてくれることを願っています。
スレッドサポートなしでコンパイルされたMPIを実行しています。

4

1 に答える 1

1

両方のメッセージに異なるタグを使用したいとします。たとえば、受信スレッドの (既知の?) ID でメッセージにタグを付けることができます。次に、プロセス 1 の各スレッドは、その ID をタグとして受信をポストし、その受信は、その特定のスレッドに向けられたメッセージにのみ一致します。

MPI 2.2 はスレッドとの限定的な相互運用性を提供することに注意してください。デフォルトでは、ほとんどの MPI 実装はスレッドセーフではありません。たとえば、Open MPI では、構成時に完全なスレッド サポートを明示的に有効にする必要があります (デフォルトでは無効になっています)。異なるスレッドで MPI 呼び出しを実行できるようにするには、少なくとも(または) の引数でMPI_THREAD_SERIALIZED返されるスレッド レベルが必要です。MPI ライブラリがまたはレベルのみを提供する場合、運が悪く、メイン スレッド以外で MPI 呼び出しを行うことができません。提供されたレベルがprovidedMPI_Thread_initMPI_Query_threadMPI_THREAD_SINGLEMPI_THREAD_FUNNELEDMPI_THREAD_SERIALIZEDの場合、任意のスレッドから MPI 呼び出しを行うことができますが、呼び出しを明示的にシリアル化する必要があります。つまり、2 つ以上の呼び出しが同時に行われないようにする必要があります (たとえば、重要なセクションやミューテックスを使用)。提供されたレベルが である場合、MPI_THREAD_MULTIPLE完全なマルチスレッド サポートがあり、任意のスレッドから任意の時点で MPI 呼び出しを行うことができます。

于 2012-05-04T19:07:52.703 に答える