点对点通信是指多NPU环境下两个NPU之间直接传输数据的通信模式,常用于pipeline并行场景下对激活值的数据收发。
HCCL提供了不同粒度的点对点通信,包括单rank到单rank的单收单发接口,以及多个rank之间的批量收发接口。
HcclSend/HcclRecv用于单收单发场景,需严格保序下发并配对使用,收发两端需完成同步后才能进行数据收发,数据收发完成后才能执行后续算子任务。
1 2 3 4 5 6 7 8 9 10 11 12 |
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可用于通信域内多个rank之间的数据收发,该接口有两个特征:
该接口使用时需要注意:单次接口调用下,两个rank之间单向数据流仅支持传递一块内存数据,避免收发过程中混淆多块内存数据的收发地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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); |