点对点通信
点对点通信可用于表达 rank 之间的任何通信模式。任何点对点通信都需要两个 MCCL 调用:一个 rank 上的 mcclSend() 调用和另一个 rank 上的相应 mcclRecv() 调用,两者具有相同的计数和数据类型。
针对不同对等体的多个 mcclSend() 和 mcclRecv() 调用可以与 mcclGroupStart() 和 mcclGroupEnd() 结合使用,形成更复杂的通信模式,如一对一(散射)、多对一(收集)、多对多或与 N 维空间中的邻居通信。
组内的点对点调用将阻塞,直到该组调用完成, 但组内的调用可以被视为独立进行,因此永远不应相互阻塞。因此,合并需要同时进行的调用以避免死锁非常重要。
以下是一些并行应用程序使用的典型点对点通信模式的例子。MCCL 语义允许所有变体,每个 rank 具有不同的大小、数据类型和缓冲区。
发送接收
在 MPI 术语中,sendrecv 操作是指两个 rank 交换数据,同时发送和接收。这可以通过合并 mcclSend 和 mcclRecv 调用来实现:
mcclGroupStart();
mcclSend(sendbuff, sendcount, sendtype, peer, comm, stream);
mcclRecv(recvbuff, recvcount, recvtype, peer, comm, stream);
mcclGroupEnd();