Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #ifndef HCCL_NSLBDP_H
12 : #define HCCL_NSLBDP_H
13 :
14 : #include <vector>
15 : #include <memory>
16 : #include <map>
17 : #include <mutex>
18 :
19 : #include "hccl/base.h"
20 : #include "hccl_common.h"
21 : #include "hccl_comm_pub.h"
22 : #include "topoinfo_struct.h"
23 : #include "sal_pub.h"
24 : #include "comm.h"
25 : #include "coll_alg_param.h"
26 : #include "hccl_nslbdp_pub.h"
27 :
28 : namespace hccl {
29 :
30 : constexpr unsigned int NSLBDP_ILLEGAL_TLVBUFFERSIZE = 0;
31 : constexpr unsigned int NSLBDP_ILLEGAL_MSGLENGTH = 0;
32 : constexpr unsigned int NSLBDP_TYPE_TBL_COMM_INFO = 1001;
33 : constexpr unsigned int NSLBDP_TYPE_TBL_OPER = 1002;
34 : constexpr unsigned int NSLBDP_TYPE_TBL_ADJ = 1003;
35 : constexpr unsigned int NSLBDP_TYPE_TBL_RANK = 1004;
36 : constexpr unsigned int NSLBDP_TYPE_TBL_RANK_DIST = 1005;
37 : constexpr unsigned int NSLBDP_TYPE_TBL_ROOT_RANK = 1006;
38 : constexpr unsigned int NSLBDP_TYPE_INIT_NETCO = 9001;
39 : constexpr unsigned int NSLBDP_TYPE_DEINIT_NETCO = 9002;
40 :
41 : constexpr u32 NSLBDP_RANKTOTALNUM_BLOCK_FIR = 1024;
42 : constexpr u32 NSLBDP_RANKTOTALNUM_BLOCK_SEC = 2 * 1024;
43 : constexpr u32 NSLBDP_RANKTOTALNUM_BLOCK_THR = 3 * 1024;
44 : constexpr u32 NSLBDP_RANKTOTALNUM_BLOCK_FOU = 4 * 1024;
45 :
46 : constexpr u32 NSLBDP_HIGH_8BIT = 8;
47 :
48 : constexpr u16 NSLBDP_COMMINTERVAL_FLAG = 128;
49 : constexpr u16 NSLBDP_COMMINTERVAL_FLAGSEC = 256;
50 : constexpr u16 NSLBDP_COMMINTERVAL_FLAGTHR = 512;
51 : constexpr u16 NSLBDP_COMMINTERVAL_FLAGFOU = 1024;
52 : constexpr u16 NSLBDP_COMMINTERVAL_FLAGFIV = 2048;
53 : constexpr u16 NSLBDP_COMMINTERVAL_FLAGSIX = 4096;
54 :
55 : constexpr u32 NSLBDP_PKTNUM_FIR = 1;
56 : constexpr u32 NSLBDP_PKTNUM_SEC = 2;
57 : constexpr u32 NSLBDP_PKTNUM_THR = 3;
58 : constexpr u32 NSLBDP_PKTNUM_FOU = 4;
59 :
60 : constexpr u32 NSLBDP_TASKID_OFFSET = 32;
61 :
62 : constexpr u32 NSLBDP_INITIME_MILLISENDS = 1000;
63 :
64 : constexpr u32 NSLBDP_PAIRWISE = 5;
65 :
66 : constexpr u32 NSLBDP_BEGINFOURBIT = 2;
67 :
68 : constexpr u32 NSLBDP_SPLIT_SIZE = 3;
69 :
70 : constexpr u16 NSLBDP_PRIVATE_PORT = 3;
71 : constexpr u16 NSLBDP_RANGE_ID = 14;
72 : constexpr u16 NSLBDP_COMMON_RANGE = 11;
73 : constexpr u16 NSLBDP_ALGO_RANGE = 4;
74 :
75 : constexpr u32 NSLBDP_TRAFFICCONUT = 60;
76 :
77 : enum class NslbDpAlgType {
78 : NSLBDP_WHOLE_RING = 0, // 单层拓扑, 所有level均为Whole ring时,组成一个大环
79 : NSLBDP_HD, // HDR
80 : NSLBDP_RING, // Ring
81 : NSLBDP_PIPELINE, // Pipeline
82 : NSLBDP_STAR,
83 : NSLBDP_NHR, // NHR
84 : NSLBDP_NHR_V1, // NHR_V1
85 : NSLBDP_NB, // NB
86 : NSLBDP_AHC, // AHC
87 : NSLBDP_AHC_BROKE, // AHC_BROKE
88 : NSLBDP_RESERVED
89 : };
90 :
91 :
92 : constexpr u8 NSLBDP_CMD_INVALID = 0;
93 : constexpr u8 NSLBDP_CMD_BROADCAST = 1;
94 : constexpr u8 NSLBDP_CMD_ALLREDUCE = 2;
95 : constexpr u8 NSLBDP_CMD_REDUCE = 3;
96 : constexpr u8 NSLBDP_CMD_SEND = 4;
97 : constexpr u8 NSLBDP_CMD_RECEIVE = 5;
98 : constexpr u8 NSLBDP_CMD_ALLGATHER = 6;
99 : constexpr u8 NSLBDP_CMD_REDUCE_SCATTER = 7;
100 : constexpr u8 NSLBDP_CMD_ALLTOALLV = 8;
101 : constexpr u8 NSLBDP_CMD_ALLTOALLVC = 9;
102 : constexpr u8 NSLBDP_CMD_ALLTOALL = 10;
103 : constexpr u8 NSLBDP_CMD_GATHER = 11;
104 : constexpr u8 NSLBDP_CMD_SCATTER = 12;
105 : constexpr u8 NSLBDP_CMD_BATCH_SEND_RECV = 13;
106 : constexpr u8 NSLBDP_CMD_BATCH_PUT = 14;
107 : constexpr u8 NSLBDP_CMD_BATCH_GET = 15;
108 : constexpr u8 NSLBDP_CMD_ALL = 16;
109 :
110 :
111 : constexpr u8 NSLB_ALGO_TYPE_DEFAULT = 0;
112 : constexpr u8 NSLB_ALGO_TYPE_RING = 1;
113 : constexpr u8 NSLB_ALGO_TYPE_PIPELINE = 2;
114 : constexpr u8 NSLB_ALGO_TYPE_FULLMESH = 3;
115 : constexpr u8 NSLB_ALGO_TYPE_HDR = 4;
116 : constexpr u8 NSLB_ALGO_TYPE_PAIRWISE = 5;
117 : constexpr u8 NSLB_ALGO_TYPE_NHR = 6;
118 : constexpr u8 NSLB_ALGO_TYPE_NHR_V1 = 7;
119 : constexpr u8 NSLB_ALGO_TYPE_NB = 8;
120 : constexpr u8 NSLB_ALGO_TYPE_NULL = 9;
121 : constexpr u8 NSLB_ALGO_TYPE_NA = 10;
122 : constexpr u8 NSLB_ALGO_TYPE_FAST_DOUBLE_RING = 11;
123 : constexpr u8 NSLB_ALGO_TYPE_AHC = 12;
124 :
125 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_BEGIN = 0;
126 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_FIR = 1;
127 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_SEC = 2;
128 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_THR = 3;
129 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_FOR = 4;
130 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_FIV = 5;
131 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_SIX = 6;
132 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_SEV = 7;
133 : constexpr u16 NSLB_COMM_INTERVAL_FLAG_MAX = 8;
134 :
135 :
136 : constexpr unsigned int MODULE_TYPE_NSLB = 0;
137 : constexpr unsigned int MODULE_TYPE_MAX = 1;
138 :
139 : constexpr u32 NSLBDP_UNDERDCORES_COUNT = 3;
140 :
141 : using nslb_msg = struct nslb_msg {
142 : unsigned int type;
143 : unsigned int length;
144 : std::string data;
145 :
146 0 : nslb_msg() : type(INVALID_UINT), length(0), data("") {}
147 : };
148 :
149 : class hcclNslbDp {
150 : public:
151 : static hcclNslbDp& GetInstance();
152 : NslbDpCommConfigVal GetNslbDpCommConfig();
153 : HcclResult HcclSetGlobalRankTotalNum(u32 nRanks);
154 :
155 : bool GetInitNetCoFlag();
156 : HcclResult ClearInitNetCoFlag();
157 : void InitCmmDesc(std::string &identifier_nslb);
158 : std::string GetCmmDesc();
159 : void SetDeviceType();
160 : void SetGlobalCommTaskId(u64 taskId);
161 : void SetGlobalCommNodeId(u32 nodeId);
162 : void SetGlobalCommLocalRankNum(u32 localRankNum);
163 : void SetGlobalCommRankTotalNum(u32 rankTotalNum);
164 : bool GetDeviceType();
165 : u64 GetGlobalCommTaskId();
166 : u32 GetGlobalCommNodeId();
167 : u32 GetTlvInitBufferSize();
168 : u8 GetGlobalCommLocalRankNum();
169 : u8 GetNslbOpType(HcclCMDType opType);
170 : u8 GetNslbLevel1AlgType(AlgTypeLevel1 algValue);
171 : u8 GetNslbLevel2AlgType(AlgTypeLevel2 algValue);
172 : u32 GetGlobalCommRankTotalNum();
173 : u32 Getl4SPortId();
174 : u64 GetNslbDpFirstFourBit(u8 opType, u8 algType);
175 : bool CheckAlgoConsistency(HcclCMDType opType, std::string& algName);
176 : void SplitString(const std::string& identifier, std::vector<std::string>& splitInfo, const std::string& frag);
177 : void SetGlobalDisRankTable(const HcclBasicRankInfo &rankTable);
178 : HcclResult SetCommInfo_NoRankTable(const RankTable_t rankTable, std::string identifier);
179 : HcclResult SetCommInfo_RankTableExit(RankTable_t rankTable);
180 : HcclResult SetGlobalRank_RankTableExit(const RankTable_t rankTable);
181 : HcclResult GenerateOpAndAdjTable(HcclCMDType opType, u32 rootRank, u32 srcLocalRankId,
182 : u8 algType, std::string identifier, u64 count, u32 rankSize);
183 : HcclResult GetAlgAdjacencyTable(HcclCMDType opType, u32 srcLocalRankId, u32 rootRank, u8 algType, std::string identifier, AdjInfo nslbAdjInfo);
184 : HcclResult GetNslbDpl4SPortId(u32 rankSize, u8 algType, u16 *l4SPortId);
185 : HcclResult SendCommRankTable(uint32_t rank, NslbDpCommConfigVal globalCommInfo);
186 : bool CheckMultiMachine(const RankTable_t rankTable);
187 : bool CheckSupportOptype(HcclCMDType opType);
188 : bool CheckCommDescExit(NslbDpOperatorInfo &OperatorInfo);
189 : bool CheckSameOperatorVal(size_t operSize, NslbDpOperatorInfo &OperatorInfo, u32 rootRank);
190 : void SetGlobalCommRankTable_RootInfo(const RankTable_t &rankTable, const HcclBasicRankInfo &localRankInfo,
191 : const std::vector<RankInfo> &rankLists, const std::string& identifier, u32 nRanks, u32 rank);
192 : void GetGlobalRankTable(const RankTable_t *rankTable, u32 nRanks, HcclUs startut);
193 : void fullCommonGlobalRankInfo(NslbDpGlobalRankInfo tab_f, NslbDpGlobalRankVal &cominfo);
194 : void fullCommConfigInfo(NslbDpCommConfigInfo &tab_f, NslbDpCommConfigVal cominfo, u32 packetNum);
195 : void fullcommDescInitTime(std::string identifier, NslbDpOperatorInfo &OperatorInfo);
196 : HcclResult SetNslbDpRootRank(HcclCMDType opType, u32 rootRank, std::string identifier, u8 algType);
197 : HcclResult SendRankTable(NslbDpCommConfigInfo tab_f);
198 : std::vector<uint8_t> serializeTLV_TableFir(NslbDpCommConfigInfo cominfo);
199 : HcclResult SendTableProc(u32 rank, u32 packetNum, NslbDpCommConfigVal cominfo);
200 : HcclResult SendTableFir(uint32_t rank);
201 : HcclResult SetH2DTlvInitInfo(u32 buffer_size, void* tlv_handle);
202 : u32 ipToUint32(const std::string& ipAddress);
203 : HcclResult SendOpAndAdjTable();
204 : HcclResult SendRankTableOpAndAdj(NslbDpOperatorInfo &tab_f);
205 : std::vector<uint8_t> serializeTLV_TableOpAndAdj(NslbDpOperatorInfo &info);
206 : HcclResult SendAlgorithmInfoTable();
207 : HcclResult SendRankTableAlgorithmInfo(NslbDpAlgorithmTlv &tab_f);
208 : std::vector<uint8_t> serializeTLV_TableAlgorithmInfo(NslbDpAlgorithmTlv &info);
209 : HcclResult SendGlobalRankTable(uint32_t rank);
210 : HcclResult SendTableGlobalRankProc(uint32_t rank, uint32_t packetNum, NslbDpGlobalRankVal &cominfo);
211 : std::vector<uint8_t> serializeTLV_TableGlobalRankInfo(NslbDpGlobalRankInfo &info);
212 : HcclResult SendRankTableGlobalRank(NslbDpGlobalRankInfo &tab_f);
213 : HcclResult SendGlobalDisRankTable();
214 : HcclResult SendRankTableGlobalDisRankVal(NslbDpGlobalDisRankVal &tab_f);
215 : std::vector<uint8_t> serializeTLV_TableGlobalDisRankVal(NslbDpGlobalDisRankVal &info);
216 : HcclResult SendRootRankTable();
217 : HcclResult SendRankTableRootRank(NslbDpRootRank &tab_f);
218 : std::vector<uint8_t> serializeTLV_TableRootRank(NslbDpRootRank &config);
219 : HcclResult InitNetCo();
220 : void DeinitNetCo();
221 : bool check910_93_ = false;
222 : std::atomic<bool>nslbdpIsInitNetCo_ = {false};
223 : void* nslbdp_handle_;
224 : unsigned int nslbdp_buffsize_;
225 : std::string nslbdp_identifier_;
226 : u32 hcclNslbDpL4SPortId_;
227 : // 上层调用数据存储关键字唯一标识的taskid等信息
228 : NslbDpGlobalCommInfo hcclNslbDpGlobalCommInfo_;
229 : // 分表1-基础数据. 承载通信与信息
230 : std::vector<NslbDpCommConfigVal> hcclNslbDpCommConfig_;
231 : // 分表2-基础数据,承载执行的算子算法信息
232 : std::vector<NslbDpOperatorInfo> hcclNslbDpOperatorVal_;
233 : // 分表3-基础数据,承载执行的算子算法的邻接信息
234 : std::vector<NslbDpAlgorithmInfo> hcclNslbDpAlgorithmInfo_;
235 : // 分表4-基础数据,在非ranktble场景下创建通信与场景承载全局通信域信息
236 : NslbDpGlobalRankVal hcclNslbDpGlobalRankVal_;
237 : // 分表5-基础数据,在非ranktble场景下创建通信与场景域场景下的分布式rank表
238 : NslbDpGlobalDisRankVal hcclNslbDpGlobalDisRankVal_;
239 : // 分表6-基础数据,非对称算子 statter, reduce,bcast 算子场景下会有rootrabnk表
240 : NslbDpRootRank hcclNslbDpRootRankVal_;
241 : private:
242 : hcclNslbDp();
243 : ~hcclNslbDp();
244 : bool CheckAhcCommInfo(NslbDpCommConfigVal comInfo);
245 : bool CheckAhcSupport(u8 algType, std::string identifier);
246 : };
247 :
248 : } // namespace hccl
249 :
250 :
251 : #endif /* HCCL_NSLB_DP_PUB_H */
|