如何使用两个线程接收两个进程,在MPI中相互发送?

时间:2012-04-09 18:43:20

标签: 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

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

1 个答案:

答案 0 :(得分:1)

您希望为这两种邮件使用不同的标记,例如您可以使用接收器线程的(已知?)ID标记消息。然后,进程1中的每个线程都会发送一个ID作为标记的接收,并且该接收只会匹配指向该特定线程的消息。

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