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

在带有 pthreads 库的 C 语言的 MPI 中。
我已经在 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 需要在配置期间显式启用完整的线程支持(默认情况下禁用)。您至少需要具有(or ) 的参数中MPI_THREAD_SERIALIZED返回的线程级别,以便能够在不同的线程中进行 MPI 调用。如果您的 MPI 库仅提供或级别,那么您很不走运,并且无法在主线程以外的地方进行 MPI 调用。如果提供的级别是providedMPI_Thread_initMPI_Query_threadMPI_THREAD_SINGLEMPI_THREAD_FUNNELEDMPI_THREAD_SERIALIZED,那么您可以从任何线程进行 MPI 调用,但是您必须显式地序列化调用,即确保没有两个或更多调用是同时进行的(例如,使用关键部分或互斥锁)。如果提供的级别是,MPI_THREAD_MULTIPLE那么您将拥有完整的多线程支持,并且可以在任何时间点从任何线程进行 MPI 调用。

于 2012-05-04T19:07:52.703 回答