基本上我想达到这样的目的:
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编译。
答案 0 :(得分:1)
您希望为这两种邮件使用不同的标记,例如您可以使用接收器线程的(已知?)ID标记消息。然后,进程1中的每个线程都会发送一个ID作为标记的接收,并且该接收只会匹配指向该特定线程的消息。
请注意,MPI 2.2提供与线程的有限互操作性。默认情况下,大多数MPI实现都不是线程安全的。例如,打开MPI需要一个在配置时显式启用完整线程支持(默认情况下禁用)。您需要在MPI_THREAD_SERIALIZED
(或provided
)的MPI_Thread_init
参数中至少返回MPI_Query_thread
线程级别,以便能够在不同的线程中进行MPI调用。如果您的MPI库仅提供MPI_THREAD_SINGLE
或MPI_THREAD_FUNNELED
级别,那么您运气不佳,并且不能在主线程之外进行MPI调用。如果提供的级别为MPI_THREAD_SERIALIZED
,那么您可以从任何线程进行MPI调用,但是您必须明确地序列化调用,即确保不会同时进行两次或多次调用(例如,使用批评部分或互斥锁) 。如果提供的级别为MPI_THREAD_MULTIPLE
,那么您将获得完整的多线程支持,并且可以从任何线程和任何时间点进行MPI调用。