C++ 具有线程支持和Bcast调用的MPI

C++ 具有线程支持和Bcast调用的MPI,c++,multithreading,pthreads,mpi,openmpi,C++,Multithreading,Pthreads,Mpi,Openmpi,我想知道,在指定有线程支持的MPI程序中,所有线程是否都进行MPI::Bcast调用(使舒尔认为在调用中,发送方进程只拥有一个线程),这是由所有其他线程接收,还是仅由每个进程的一个线程接收(最快的)?根据MPI实现中的线程支持级别(请检查,MPI中的线程支持非常粗略),每个进程只进行一次MPI调用 根据MPI实现中的线程支持级别(请检查,MPI中的线程支持非常粗略),每个进程只进行一次MPI调用 常见的MPI实现处理进程之间的通信。支持线程的实现只允许多个线程进行部分或全部MPI调用,而不是一个

我想知道,在指定有线程支持的MPI程序中,所有线程是否都进行MPI::Bcast调用(使舒尔认为在调用中,发送方进程只拥有一个线程),这是由所有其他线程接收,还是仅由每个进程的一个线程接收(最快的)?

根据MPI实现中的线程支持级别(请检查,MPI中的线程支持非常粗略),每个进程只进行一次MPI调用

根据MPI实现中的线程支持级别(请检查,MPI中的线程支持非常粗略),每个进程只进行一次MPI调用

常见的MPI实现处理进程之间的通信。支持线程的实现只允许多个线程进行部分或全部MPI调用,而不是一个。调用
MPI\u Bcast
的进程中的每一个
T
线程都意味着该进程调用了
MPI\u Bcast
T次,并且期望通信器上的所有其他列组都会这样做。

常见的MPI实现处理进程之间的通信。支持线程的实现只允许多个线程进行部分或全部MPI调用,而不是一个。调用
MPI\u Bcast
的进程中的每一个
T
线程都意味着该进程调用了
MPI\u Bcast
T次,并期望通信器上的所有其他列组也这样做。

要补充Novelocrat给出的答案:

MPI中的基本计算单元是“秩”。在大多数(所有?)有趣的MPI实现中,秩是一个过程。进程中的所有线程共享相同的列组ID

MPI标准支持多个级别的线程并行性:MPI_线程单线程、MPI_线程漏斗、MPI_线程序列化和MPI_线程多线程


其中,只有MPI_THREAD_MULTILE实际上有多个线程对MPI库进行重叠调用。其他三种情况是来自应用程序的断言,即可以将列组视为“单线程”

要补充Novelocrat给出的答案:

MPI中的基本计算单元是“秩”。在大多数(所有?)有趣的MPI实现中,秩是一个过程。进程中的所有线程共享相同的列组ID

MPI标准支持多个级别的线程并行性:MPI_线程单线程、MPI_线程漏斗、MPI_线程序列化和MPI_线程多线程


其中,只有MPI_THREAD_MULTILE实际上有多个线程对MPI库进行重叠调用。其他三种情况是来自应用程序的断言,即可以将列组视为“单线程”

Novelocrat,这是有道理的。因此,让来自不同进程的所有线程调用Bcast是一个重大灾难。谢谢你的回答。Novelocrat,我还有一个问题,假设启用了多线程支持,同一进程中有两个线程,它们可以使用MPI_Send和MPI_Recv在它们之间进行通信,还是会导致死锁?进程可能可以使用Isend/Irecv与其自身进行通信,但这有点傻。请记住,进程中的所有线程仍然是相同MPI级别的一部分。此外,
MPI\u Send
被允许阻止,直到匹配的接收完成。如果它是对自身的,并且没有发布接收,那就是死锁。在更高的级别上,如果在一个进程中显式运行多个线程,为什么要使用MPI在它们之间进行通信?你得到了进程间通信的所有开销,以及线程编程的所有痛苦。Novelocrat,这是有意义的。因此,让来自不同进程的所有线程调用Bcast是一个重大灾难。谢谢你的回答。Novelocrat,我还有一个问题,假设启用了多线程支持,同一进程中有两个线程,它们可以使用MPI_Send和MPI_Recv在它们之间进行通信,还是会导致死锁?进程可能可以使用Isend/Irecv与其自身进行通信,但这有点傻。请记住,进程中的所有线程仍然是相同MPI级别的一部分。此外,
MPI\u Send
被允许阻止,直到匹配的接收完成。如果它是对自身的,并且没有发布接收,那就是死锁。在更高的级别上,如果在一个进程中显式运行多个线程,为什么要使用MPI在它们之间进行通信?您将获得进程间通信的所有开销,以及线程编程的所有痛苦。