点对点通信函数
当 rank 需要发送和接收彼此之间的任意数据,而这些数据不能表示为 Broadcast 或 AllGather 时,即发送和接收的所有数据都不相同时,需要使用点对点通信原语。
mcclSend
mcclResult_t mcclSend(const void* sendbuff, size_t count, mcclDataType_t datatype, int peer, mcclComm_t comm, musaStream_t stream)
从 sendbuff 发送数据到 rank peer。
rank peer 需要调用 mcclRecv,使用与此 rank 相同的 datatype 和相同的 count。
此操作对 GPU 是阻塞的。如果需要并行完成多个 mcclSend() 和 mcclRecv() 操作,它们必须在 mcclGroupStart() 与 mcclGroupEnd() 部分内融合。
相关链接:点对点通信。
mcclRecv
mcclResult_t mcclRecv(void* recvbuff, size_t count, mcclDataType_t datatype, int peer, mcclComm_t comm, musaStream_t stream)
从 rank peer 接收数据到 recvbuff。
rank peer 需要调用 mcclSend,使用与此 rank 相同的 datatype 和相同的 count。
此操作对 GPU 是阻塞的。如果需要并行完成多个 mcclSend() 和 mcclRecv() 操作,必须将它们放在 mcclGroupStart() 与 mcclGroupEnd() 区段内合并调用。
相关链接:点对点通信。
mcclPutSignal
mcclResult_t mcclPutSignal(const void* localbuff, size_t count, mcclDataType_t datatype,
int peer, mcclWindow_t peerWin, size_t peerWinOffset,
int sigIdx, int ctx, unsigned int flags, mcclComm_t comm, musaStream_t stream)
单边操作:先把本地缓冲区数据写入对端已注册窗口,再向对端发送 signal。
适用于“写入 payload + 立即通知”的场景。详细使用建议见 RMA Signal。
mcclSignal
mcclResult_t mcclSignal(int peer, int sigIdx, int ctx, unsigned int flags,
mcclComm_t comm, musaStream_t stream)
只发送 signal,不传输 payload。适用于纯控制面同步。
mcclWaitSignal
mcclResult_t mcclWaitSignal(int nDesc, mcclWaitSignalDesc_t* signalDescs,
mcclComm_t comm, musaStream_t stream)
等待一个或多个 signal 描述符满足。signalDescs 数组中的元素由 mcclWaitSignalDesc_t 描述,包括来源 peer、signal 索引、上下文和操作计数。

