点对点通信
点对点通信是指多NPU环境下两个NPU之间直接传输数据的通信模式,常用于pipeline并行场景下对激活值的数据收发。
HCCL提供了不同粒度的点对点通信,包括单rank到单rank的单收单发接口,以及多个rank之间的批量收发接口。
HcclSend/HcclRecv
HcclSend/HcclRecv用于单收单发场景,需严格保序下发并配对使用,收发两端需完成同步后才能进行数据收发,数据收发完成后才能执行后续算子任务。
一个简单的代码示例片段如下:
if(rankId == 0){ uint32_t destRank = 1; uint32_t srcRank = 1; HcclSend(sendBuf, count, dataType, destRank, hcclComm, stream); HcclRecv(recvBuf, count, dataType, srcRank, hcclComm, stream); } if(rankId == 1){ uint32_t srcRank = 0; uint32_t destRank = 0; HcclRecv(recvBuf, count, dataType, srcRank, hcclComm, stream); HcclSend(sendBuf, count, dataType, destRank, hcclComm, stream); }
完整的代码示例可参见样例代码章节不同通信域初始化方式中的“HcclSend/HcclRecv操作代码样例”。
HcclBatchSendRecv
HcclBatchSendRecv可用于通信域内多个rank之间的数据收发,该接口有两个特征:
- 接口内部会对批量数据收发顺序进行重排,所以不严格要求单次接口调用中批量收发的任务顺序,但需要确保一次接口调用中的数据发送与数据接收操作个数完全匹配。
- 收发过程独立调度执行,收发不相互阻塞,从而实现双工链路并发。
该接口使用时需要注意:单次接口调用下,两个rank之间单向数据流仅支持传递一块内存数据,避免收发过程中混淆多块内存数据的收发地址。
一个简单的代码示例片段如下:
HcclSendRecvItem sendRecvInfo[itemNum]; HcclSendRecvType currType; for (size_t i = 0; i < op_type.size(); ++i) { if (op_type[i] == "isend") { currType = HcclSendRecvType::HCCL_SEND; } else if (op_type[i] == "irecv") { currType = HcclSendRecvType::HCCL_RECV; } sendRecvInfo[i] = HcclSendRecvItem{currType, tensor_ptr_list[i], count_list[i], type_list[i], remote_rank_list[i] }; } HcclBatchSendRecv(sendRecvInfo, itemNum, hcclComm, stream);
父主题: 通信功能开发