点对点通信函数

(自 NCCL 2.7 起) 当 ranks 需要相互发送和接收任意数据时,需要使用点对点通信原语,这些数据不能表示为广播或 allgather,即当所有发送和接收的数据都不同时。

ncclSend

ncclResult_t ncclSend(const void* sendbuff, size_t count, ncclDataType_t datatype, int peer, ncclComm_t comm, cudaStream_t stream)

将数据从 sendbuff 发送到 rank peer

Rank peer 需要使用相同的 datatype 和相同的 count 调用 ncclRecv。

此操作对于 GPU 是阻塞的。 如果多个 ncclSend()ncclRecv() 操作需要并发进行才能完成,则它们必须在 ncclGroupStart()/ ncclGroupEnd() 部分内融合。

相关链接: 点对点通信

ncclRecv

ncclResult_t ncclRecv(void* recvbuff, size_t count, ncclDataType_t datatype, int peer, ncclComm_t comm, cudaStream_t stream)

从 rank peer 接收数据到 recvbuff 中。

Rank peer 需要使用相同的 datatype 和相同的 count 调用 ncclSend。

此操作对于 GPU 是阻塞的。 如果多个 ncclSend()ncclRecv() 操作需要并发进行才能完成,则它们必须在 ncclGroupStart()/ ncclGroupEnd() 部分内融合。

相关链接: 点对点通信