c - 如何使具有两个线程的两个进程在MPI中相互接收、发送?

标签 c pthreads mpi distributed-computing pvm

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

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 ,
从机.c:http://pastebin.com/gfeCkcss .
我尝试做的事情:
程序.c:http://pastebin.com/tCVKN3fe
不知何故,接收器线程没有收到任何东西。我不知道问题是什么。我希望有人能告诉我正确的方法。
我正在运行没有线程支持的 MPI 编译。

最佳答案

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

请注意,MPI 2.2 提供与线程的有限互操作性。默认情况下,大多数 MPI 实现都不是线程安全的。例如,开放 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 调用。

关于c - 如何使具有两个线程的两个进程在MPI中相互接收、发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10078049/

相关文章:

c - 关于 pthread_create() 有一些疑问

c++ - Microsft MPI MPI_Isend 中的死锁

mpi - MPI_SENDRECV如何工作?

c - libcurl,用法 CURLOPT_REDIR_PROTOCOLS

c - 简单字符串匹配期间比较的字符数

一个进程可以同时在两个信号量上调用 "down"吗?

c - 在运行一些计算时写入 txt 文件

c - 为什么信号量不阻塞第二个线程? (C)

c++ - 给信号量一个id

graph - mpi 并行的快速图形分区