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 FFTS_COMMON_PUB_H
12 : #define FFTS_COMMON_PUB_H
13 :
14 : #include <cstdint>
15 : #include <map>
16 : #include <vector>
17 : #include <memory>
18 :
19 : #include "hccl/base.h"
20 : #include "adapter_rts_common.h"
21 : #include "hccl_common.h"
22 : #include "common.h"
23 : #include "device_capacity.h"
24 :
25 : namespace hccl {
26 : enum class ReduceType {
27 : INLINE_REDUCE = 0,
28 : TBE_REDUCE
29 : };
30 :
31 : enum class CopyPattern {
32 : ZCOPY = 0,
33 : BCOPY
34 : };
35 :
36 : using HcclOpMetaInfo = struct HcclOpMetaInfoDef {
37 : HcclCMDType opType = HcclCMDType::HCCL_CMD_INVALID;
38 : bool isRootRank = false;
39 : bool isSmallCount = false;
40 : uint32_t rootRank = INVALID_UINT;
41 : uint32_t KEY_SIZE = 100;
42 : bool isDefaultPath = true; // 是否为默认子图路径
43 : ReduceType reduceType = ReduceType::INLINE_REDUCE;
44 : CopyPattern copyPattern = CopyPattern::BCOPY;
45 : u64 alltoallvSendDataSize = 0;
46 : u64 alltoallvcSendDataSize = 0;
47 : u32 piplineSliceNum = 1;
48 : HcclDataType dataType = HCCL_DATA_TYPE_RESERVED;
49 : u32 algolevel1Type = 0;
50 : bool hugeData = false;
51 : u64 sliceNum = 1;
52 : bool dataSplit = false;
53 : bool isAivMode = false;
54 : bool isEnableCache = true;
55 : u8 deterministic = 0;
56 : bool preloadCopyOpt = false;
57 :
58 56 : static bool CheckEnableCache(const HcclOpMetaInfoDef &opMetaInfo)
59 : {
60 56 : if (opMetaInfo.opType == HcclCMDType::HCCL_CMD_BATCH_SEND_RECV || opMetaInfo.opType == HcclCMDType::HCCL_CMD_SEND ||
61 56 : opMetaInfo.opType == HcclCMDType::HCCL_CMD_RECEIVE || opMetaInfo.hugeData) {
62 0 : return false;
63 : }
64 :
65 56 : if (opMetaInfo.alltoallvSendDataSize > RDMA_SEND_MAX_SIZE ||
66 56 : opMetaInfo.alltoallvcSendDataSize > RDMA_SEND_MAX_SIZE) {
67 0 : return false;
68 : }
69 112 : return !((opMetaInfo.opType == HcclCMDType::HCCL_CMD_ALLTOALLV ||
70 56 : opMetaInfo.opType == HcclCMDType::HCCL_CMD_ALLTOALL ||
71 56 : opMetaInfo.opType == HcclCMDType::HCCL_CMD_ALLTOALLVC) &&
72 56 : (opMetaInfo.copyPattern == CopyPattern::BCOPY));
73 : }
74 :
75 22 : static HcclOpMetaInfoDef GetOneForAllReduce(u32 algolevel1Type = 0,
76 : HcclDataType dataType = HCCL_DATA_TYPE_RESERVED, ReduceType reduceType = ReduceType::INLINE_REDUCE,
77 : bool isSmallCount = false, u32 piplineSliceNum = 1, bool hugeData = false,
78 : CopyPattern copyPattern = CopyPattern::BCOPY, u64 sliceNum = 1,
79 : bool isAivModeConfig = false, bool isDefaultPathConfig = true, bool dataSplitConfig = false,
80 : u8 deterministicConfig = 0)
81 : {
82 22 : HcclOpMetaInfoDef meta;
83 22 : meta.opType = HcclCMDType::HCCL_CMD_ALLREDUCE;
84 22 : meta.copyPattern = copyPattern;
85 22 : meta.reduceType = reduceType;
86 22 : meta.dataType = dataType;
87 22 : meta.isSmallCount = isSmallCount;
88 22 : meta.piplineSliceNum = piplineSliceNum;
89 22 : meta.algolevel1Type = algolevel1Type;
90 22 : meta.hugeData = hugeData;
91 22 : meta.sliceNum = sliceNum;
92 22 : meta.isAivMode = isAivModeConfig;
93 22 : meta.isEnableCache = CheckEnableCache(meta);
94 22 : meta.isDefaultPath = isDefaultPathConfig;
95 22 : meta.dataSplit = dataSplitConfig;
96 22 : meta.deterministic = deterministicConfig;
97 22 : return meta;
98 : }
99 :
100 18 : static HcclOpMetaInfoDef GetOneForAllGather(u32 algolevel1Type = 0, bool hugeData = false, bool smallCount = false,
101 : CopyPattern copyPattern = CopyPattern::BCOPY, bool dataSplit = false, bool isAivMode = false)
102 : {
103 18 : HcclOpMetaInfoDef meta;
104 18 : meta.opType = HcclCMDType::HCCL_CMD_ALLGATHER;
105 18 : meta.copyPattern = copyPattern;
106 18 : meta.algolevel1Type = algolevel1Type;
107 18 : meta.hugeData = hugeData;
108 18 : meta.isSmallCount = smallCount;
109 18 : meta.isEnableCache = CheckEnableCache(meta);
110 18 : meta.dataSplit = dataSplit;
111 18 : meta.isAivMode = isAivMode;
112 18 : return meta;
113 : }
114 :
115 0 : static HcclOpMetaInfoDef GetOneForAllGatherV(u32 algolevel1Type = 0, bool hugeData = false, bool smallCount = false,
116 : CopyPattern copyPattern = CopyPattern::BCOPY, bool dataSplit = false)
117 : {
118 0 : HcclOpMetaInfoDef meta;
119 0 : meta.opType = HcclCMDType::HCCL_CMD_ALLGATHER_V;
120 0 : meta.copyPattern = copyPattern;
121 0 : meta.algolevel1Type = algolevel1Type;
122 0 : meta.hugeData = hugeData;
123 0 : meta.isSmallCount = smallCount;
124 0 : meta.isEnableCache = CheckEnableCache(meta);
125 0 : meta.dataSplit = dataSplit;
126 0 : return meta;
127 : }
128 :
129 0 : static HcclOpMetaInfoDef GetOneForBroadcast(bool isRootRank, uint32_t rootRank,
130 : bool hugeData = false, bool isSmallCount = false, u64 sliceNum = 1, CopyPattern copyPattern = CopyPattern::BCOPY)
131 : {
132 0 : HcclOpMetaInfoDef meta;
133 0 : meta.opType = HcclCMDType::HCCL_CMD_BROADCAST;
134 0 : meta.isSmallCount = isSmallCount; // 是否小数据
135 0 : meta.isRootRank = isRootRank;
136 0 : meta.rootRank = rootRank;
137 0 : meta.hugeData = hugeData;
138 0 : meta.sliceNum = sliceNum;
139 0 : meta.copyPattern = copyPattern;
140 0 : meta.isEnableCache = CheckEnableCache(meta);
141 0 : return meta;
142 : }
143 :
144 0 : static HcclOpMetaInfoDef GetOneForScatter(uint32_t rootRank, bool hugeData = false)
145 : {
146 0 : HcclOpMetaInfoDef meta;
147 0 : meta.opType = HcclCMDType::HCCL_CMD_SCATTER;
148 0 : meta.rootRank = rootRank;
149 0 : meta.hugeData = hugeData;
150 0 : meta.isEnableCache = CheckEnableCache(meta);
151 0 : return meta;
152 : }
153 :
154 16 : static HcclOpMetaInfoDef GetOneForReduceScatter(
155 : u32 algolevel1Type = 0, HcclDataType dataType = HCCL_DATA_TYPE_RESERVED,
156 : ReduceType reduceType = ReduceType::INLINE_REDUCE, bool hugeData = false,
157 : bool isSmallCount = false, CopyPattern copyPattern = CopyPattern::BCOPY, bool dataSplit = false,
158 : u8 deterministicConfig = 0, bool isAivModeConfig = false, bool preloadCopyFlag = false)
159 : {
160 16 : HcclOpMetaInfoDef meta;
161 16 : meta.opType = HcclCMDType::HCCL_CMD_REDUCE_SCATTER;
162 16 : meta.reduceType = reduceType;
163 16 : meta.dataType = dataType;
164 16 : meta.algolevel1Type = algolevel1Type;
165 16 : meta.hugeData = hugeData;
166 16 : meta.isSmallCount = isSmallCount; // 是否小数据
167 16 : meta.copyPattern = copyPattern;
168 16 : meta.isEnableCache = CheckEnableCache(meta);
169 16 : meta.dataSplit = dataSplit;
170 16 : meta.deterministic = deterministicConfig;
171 16 : meta.isAivMode = isAivModeConfig;
172 16 : meta.preloadCopyOpt = preloadCopyFlag;
173 16 : return meta;
174 : }
175 :
176 0 : static HcclOpMetaInfoDef GetOneForReduceScatterV(
177 : u32 algolevel1Type = 0, HcclDataType dataType = HCCL_DATA_TYPE_RESERVED,
178 : ReduceType reduceType = ReduceType::INLINE_REDUCE, bool hugeData = false,
179 : bool isSmallCount = false, CopyPattern copyPattern = CopyPattern::BCOPY, bool dataSplit = false,
180 : u8 deterministicConfig = 0)
181 : {
182 0 : HcclOpMetaInfoDef meta;
183 0 : meta.opType = HcclCMDType::HCCL_CMD_REDUCE_SCATTER_V;
184 0 : meta.reduceType = reduceType;
185 0 : meta.dataType = dataType;
186 0 : meta.algolevel1Type = algolevel1Type;
187 0 : meta.hugeData = hugeData;
188 0 : meta.isSmallCount = isSmallCount; // 是否小数据
189 0 : meta.copyPattern = copyPattern;
190 0 : meta.isEnableCache = CheckEnableCache(meta);
191 0 : meta.dataSplit = dataSplit;
192 0 : meta.deterministic = deterministicConfig;
193 0 : return meta;
194 : }
195 :
196 0 : static HcclOpMetaInfoDef GetOneForAllToAll(CopyPattern copyPattern, u64 dataSize, bool hugeData = false,
197 : bool isAivMode = false)
198 : {
199 0 : HcclOpMetaInfoDef meta;
200 0 : meta.opType = HcclCMDType::HCCL_CMD_ALLTOALL;
201 0 : meta.copyPattern = copyPattern;
202 0 : meta.alltoallvcSendDataSize = dataSize;
203 0 : meta.hugeData = hugeData;
204 0 : meta.isAivMode = isAivMode;
205 0 : meta.isEnableCache = CheckEnableCache(meta);
206 0 : return meta;
207 : }
208 :
209 0 : static HcclOpMetaInfoDef GetOneForAllToAllV(CopyPattern copyPattern, u64 dataSize,
210 : bool hugeData = false, bool isSmallCount = false)
211 : {
212 0 : HcclOpMetaInfoDef meta;
213 0 : meta.opType = HcclCMDType::HCCL_CMD_ALLTOALLV;
214 0 : meta.copyPattern = copyPattern;
215 0 : meta.alltoallvSendDataSize = dataSize;
216 0 : meta.hugeData = hugeData;
217 0 : meta.isSmallCount = isSmallCount; // 是否小数据
218 0 : meta.isEnableCache = CheckEnableCache(meta);
219 0 : return meta;
220 : }
221 :
222 0 : static HcclOpMetaInfoDef GetOneForAllToAllVC(CopyPattern copyPattern, u64 dataSize, bool hugeData = false)
223 : {
224 0 : HcclOpMetaInfoDef meta;
225 0 : meta.opType = HcclCMDType::HCCL_CMD_ALLTOALLVC;
226 0 : meta.copyPattern = copyPattern;
227 0 : meta.alltoallvcSendDataSize = dataSize;
228 0 : meta.hugeData = hugeData;
229 0 : meta.isEnableCache = CheckEnableCache(meta);
230 0 : return meta;
231 : }
232 :
233 0 : static HcclOpMetaInfoDef GetOneForSend()
234 : {
235 0 : HcclOpMetaInfoDef meta;
236 0 : meta.opType = HcclCMDType::HCCL_CMD_SEND;
237 0 : meta.isEnableCache = CheckEnableCache(meta);
238 0 : return meta;
239 : }
240 :
241 0 : static HcclOpMetaInfoDef GetOneForRecieve()
242 : {
243 0 : HcclOpMetaInfoDef meta;
244 0 : meta.opType = HcclCMDType::HCCL_CMD_RECEIVE;
245 0 : meta.isEnableCache = CheckEnableCache(meta);
246 0 : return meta;
247 : }
248 :
249 0 : static HcclOpMetaInfoDef GetOneForBatchSendRecv()
250 : {
251 0 : HcclOpMetaInfoDef meta;
252 0 : meta.opType = HcclCMDType::HCCL_CMD_BATCH_SEND_RECV;
253 0 : meta.isEnableCache = CheckEnableCache(meta);
254 0 : return meta;
255 : }
256 :
257 0 : static HcclOpMetaInfoDef GetOneForReduce(bool isRootRank, uint32_t rootRank, u32 algolevel1Type = 0,
258 : HcclDataType dataType = HCCL_DATA_TYPE_RESERVED, ReduceType reduceType = ReduceType::INLINE_REDUCE,
259 : bool hugeDataConfig = false, u8 deterministicConfig = 0)
260 : {
261 0 : HcclOpMetaInfoDef meta;
262 0 : meta.opType = HcclCMDType::HCCL_CMD_REDUCE;
263 0 : meta.isRootRank = isRootRank;
264 0 : meta.rootRank = rootRank;
265 0 : meta.reduceType = reduceType;
266 0 : meta.dataType = dataType;
267 0 : meta.algolevel1Type = algolevel1Type;
268 0 : meta.hugeData = hugeDataConfig;
269 0 : meta.isEnableCache = CheckEnableCache(meta);
270 0 : meta.deterministic = deterministicConfig;
271 0 : return meta;
272 : }
273 :
274 56 : std::string GetCacheKey() const
275 : {
276 : #ifndef CCL_KERNEL_AICPU
277 56 : std::string key;
278 56 : key.reserve(KEY_SIZE);
279 56 : key.append(std::to_string(static_cast<int>(opType)));
280 56 : key.append(1, '_');
281 56 : key.append(1, isRootRank ? '1' : '0');
282 56 : key.append(1, '_');
283 56 : key.append(std::to_string(static_cast<int>(reduceType)));
284 56 : key.append(1, '_');
285 56 : key.append(std::to_string(rootRank));
286 56 : key.append(1, '_');
287 56 : key.append(std::to_string(sliceNum));
288 56 : key.append(1, '_');
289 56 : key.append(std::to_string(static_cast<int>(dataType)));
290 56 : key.append(1, '_');
291 56 : key.append(1, isSmallCount ? '1' : '0');
292 56 : key.append(1, '_');
293 56 : key.append(1, isDefaultPath ? '1' : '0');
294 56 : key.append(1, '_');
295 56 : key.append(std::to_string(piplineSliceNum));
296 56 : key.append(1, '_');
297 56 : key.append(std::to_string(algolevel1Type));
298 56 : key.append(1, '_');
299 56 : key.append(std::to_string(static_cast<int>(copyPattern)));
300 56 : key.append(1, '_');
301 56 : key.append(1, dataSplit ? '1' : '0');
302 56 : key.append(1, '_');
303 56 : key.append(1, isAivMode ? '1' : '0');
304 56 : key.append(1, '_');
305 56 : key.append(std::to_string(deterministic));
306 56 : key.append(1, '_');
307 56 : key.append(std::to_string(preloadCopyOpt));
308 56 : return key;
309 : #else
310 : return "";
311 : #endif
312 0 : }
313 : };
314 : }
315 : #endif // FFTS_COMMON_PUB_H
|