基本上我想实现这样的目标:
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_SINGLE
或 MPI_THREAD_FUNNELED
级别,那么您就不走运了,无法在主线程以外的地方进行 MPI 调用。如果提供的级别是 MPI_THREAD_SERIALIZED ,那么您可以从任何线程进行 MPI 调用,但您必须显式序列化这些调用,即确保不会同时进行两个或多个调用(例如,对于关键部分)或互斥体)。如果提供的级别是MPI_THREAD_MULTIPLE
,那么您就拥有完整的多线程支持,并且可以在任何时间点从任何线程进行 MPI 调用。
关于c - 如何使具有两个线程的两个进程在MPI中相互接收、发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10078049/