Skip to main content

点对点通信函数

当 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 索引、上下文和操作计数。