【问题标题】:How to make two processes with two threads recieve, send to each other in MPI?如何使两个线程的两个进程在 MPI 中相互接收、发送?
【发布时间】:2012-04-22 02:40:58
【问题描述】:

基本上我想实现这样的目标:

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

在用于 C 语言的 MPI 中,带有 pthreads 库。
我已经在 PVM 中做过了,这是源代码:
master.c : http://pastebin.com/wwEie7gn ,
slave.c : http://pastebin.com/gfeCkcss .
我想做什么:
prog.c : http://pastebin.com/tCVKN3fe
不知何故,接收者线程没有收到任何东西。我不知道问题是什么。我希望有人能告诉我正确的方法。
我正在运行没有线程支持的 MPI。

【问题讨论】:

标签: c pthreads mpi distributed-computing pvm


【解决方案1】:

您想为两条消息使用不同的标签,例如您可以使用接收者线程的(已知?)ID 来标记消息。然后进程 1 中的每个线程都会发布一个带有其 ID 作为标签的接收,并且该接收只会匹配定向到该特定线程的消息。

请注意,MPI 2.2 与线程的互操作性有限。默认情况下,大多数 MPI 实现都不是线程安全的。例如,Open MPI 需要在配置期间显式启用完整的线程支持(默认情况下禁用)。您至少需要在MPI_Thread_init(或MPI_Query_thread)的provided 参数中返回MPI_THREAD_SERIALIZED 线程级别,以便能够在不同线程中进行MPI 调用。如果您的 MPI 库仅提供 MPI_THREAD_SINGLEMPI_THREAD_FUNNELED 级别,那么您很不走运,并且无法在主线程之外进行 MPI 调用。如果提供的级别是MPI_THREAD_SERIALIZED,那么您可以从任何线程进行 MPI 调用,但您必须显式地序列化调用,即确保不会同时进行两个或多个调用(例如,使用关键部分或互斥锁)。如果提供的级别是MPI_THREAD_MULTIPLE,那么您就拥有完整的多线程支持,并且可以在任何时间点从任何线程进行 MPI 调用。

【讨论】:

  • 谢谢,我最终自己构建了 MPI,并带有一个启用线程支持的标志。
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2017-06-07
  • 1970-01-01
  • 2017-01-20
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多