2011-07-12 34 views
1

我想知道如果在MPI程序中指定有线程支持,所有线程都会进行MPI :: Bcast调用(使得在调用中,发送程序只支持一个线程),这是由所有其他线程接收的,还是仅仅来自每个进程的一个线程(最快)?带线程支持和Bcast调用的MPI

回答

3

常见的MPI实现处理进程之间的通信。支持线程的实现只允许多个线程进行一些或全部MPI调用,而不仅仅是一个。调用MPI_Bcast的进程中的每个T线程表示该进程已调用MPI_Bcast T次,并且期望通信器上的所有其他等级都会执行相同的操作。

+0

新奇事物,这是有道理的。因此,来自不同进程的所有线程都会调用Bcast,这是一场重大的灾难。感谢你的回答。 – SwatchPuppy

+0

Novelocrat,我还有一个问题,想象在启用多线程支持的情况下,在同一个进程中有两个线程,他们可以使用MPI_Send和MPI_Recv在它们之间进行通信,还是会导致死锁? – SwatchPuppy

+0

一个进程可能可能使用Isend/Irecv与自己进行通信,但那会有点愚蠢。请记住,你的流程中的所有线程仍然是同一个MPI级别的一部分。此外,允许“MPI_Send”阻塞,直到匹配的接收完成。如果它本身就是这样,并且没有发布接收,那就是僵局。 – Novelocrat

1

根据MPI执行中的线程支持级别(请检查,MPI中的线程支持非常简单),每个进程只进行一次MPI调用。

1

要添加到Novelocrat给出了答案:

计算的MPI的基本单位是“等级”。在MPI的大多数(全部)有趣的实现中,等级是一个过程。一个进程中的所有线程共享相同的等级ID。

MPI标准支持多级别的线程并行:MPI_THREAD_SINGLE,MPI_THREAD_FUNNELED,MPI_THREAD_SERIALIZED和MPI_THREAD_MULTIPLE。

其中,只有MPI_THREAD_MULTILE实际上有多个线程将重叠调用插入到MPI库中。另外三种情况是应用程序声称Rank可以被视为“单线程”。欲了解更多信息,请参阅MPI Standard entry on MPI_INIT_THREAD