这里写自定义目录标题
我们之前讲了,blocking point-to-point communication,这种通讯只会涉及两个不同的线程.
而现在的Collective Communication (MPI 集体通信) 指的是一个通信行为涉及 communicator 里面所有进程的一个方法。
集体通信概念 与 同步点
synchronization point
这意味着所有的进程在执行代码的时候必须首先_都_到达一个同步点才能继续执行后面的代码。
也即先完成同步点前代码的进程将被阻塞,等到所有进程都到同步点后再进行同步点下方代码
为了同步而进行的阻塞 MPI_Barrier()
MPI_Barrier(MPI_Comm communicator)
(Barrier,屏障)- 这个方法会构建一个屏障,任何该通讯器(Commuincator)进程都没法跨越屏障,直到所有的进程都到达屏障,才可进行下一步.
MPI_Barrier
在很多时候很有用。其中一个用途是用来同步一个程序,使得分布式代码中的某一部分可以被精确的计时
那MPI_Barrier()是如何实现的呢?
我们之前 在 [[Blocking point-to-pointCommunicator]]中用MPI_Recv() 和MPI_Send() 实现的 ring.c 程序就是它的一个简单实现 :我们当时写了一个在所有进程里以环的形式传递一个令牌(token)的程序,这种形式的程序是最简单的一种实现屏障的方式,因为令牌只有在所有程序都完成之后才能被传递回第一个进程
关于同步最后一个要注意的地方是:始终记得每一个你调用的集体通信方法都是同步的
集体方法均是会同步的
如果你没法让所有进程都完成 MPI_Barrier
,那么你也没法完成任何集体调用。如果你在没有确保所有进程都调用 MPI_Barrier
的情况下调用了它,那么程序会空闲下来。
broadcasting (广播)(MPI_Bcast())
广播 (broadcast) 是标准的集体通信技术之一
==> Broadcast 肯定是会同步的
一个广播发生的时候,一个进程会把同样一份数据传递给一个 communicator 里的所有其他进程
广播的用途
- 用户输入传递给一个分布式程序
- 把一些配置参数传递给所有的进程。
![[Pasted image 20230916102424.png]]