点对点通信

点对点通信是指多NPU环境下两个NPU之间直接传输数据的通信模式,常用于pipeline并行场景下对激活值的数据收发。

HCCL提供了不同粒度的点对点通信,包括单rank到单rank的单收单发接口,以及多个rank之间的批量收发接口。

HcclSend/HcclRecv

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

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);