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 : #include "reduce_scatter_v_operator.h"
12 : #include "device_capacity.h"
13 : #include "hccl_aiv.h"
14 :
15 : namespace hccl {
16 :
17 : constexpr u64 MAX_310P_RANK_SIZE = 4;
18 :
19 0 : ReduceScatterVOperator::ReduceScatterVOperator(AlgConfigurator* algConfigurator, CCLBufferManager &cclBufferManager,
20 0 : HcclDispatcher dispatcher, std::unique_ptr<TopoMatcher> &topoMatcher) :
21 0 : CollAlgOperator(algConfigurator, cclBufferManager, dispatcher, topoMatcher, HcclCMDType::HCCL_CMD_REDUCE_SCATTER_V)
22 : {
23 0 : }
24 :
25 0 : ReduceScatterVOperator::~ReduceScatterVOperator()
26 : {
27 0 : }
28 :
29 0 : HcclResult ReduceScatterVOperator::SelectAlg(const std::string& tag, const OpParam& param,
30 : std::string& algName, std::string& newTag)
31 : {
32 : HcclResult ret;
33 :
34 0 : if (isDiffDeviceType_) {
35 0 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlg] ReduceScatterV not support diffDeviceType");
36 0 : return HCCL_E_NOT_SUPPORT;
37 0 : } else if (deviceType_ == DevType::DEV_TYPE_910_93) {
38 0 : ret = SelectAlgfor91093(param, algName);
39 0 : } else if (deviceType_ == DevType::DEV_TYPE_910B) {
40 0 : ret = SelectAlgfor910B(param, algName);
41 0 : } else if (deviceType_ == DevType::DEV_TYPE_310P3) {
42 0 : ret = SelectAlgfor310P3(param, algName);
43 : } else {
44 0 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlg] ReduceScatterV only support A3, A2 and 310P.");
45 0 : return HCCL_E_NOT_SUPPORT;
46 : }
47 0 : CHK_PRT_RET(ret != HCCL_SUCCESS,
48 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlg]tag[%s], ReduceScatterV failed, return[%d]",
49 : tag.c_str(), ret), ret);
50 :
51 0 : if (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB) {
52 0 : newTag = tag;
53 : } else {
54 0 : if (deviceType_ == DevType::DEV_TYPE_310P3) {
55 0 : newTag = tag + algName;
56 : } else {
57 0 : AlgTypeLevel1 algType1 = algType_.algoLevel1;
58 0 : auto level1Iter = HCCL_ALGO_LEVEL1_NAME_MAP.find(algType1);
59 0 : CHK_PRT_RET(level1Iter == HCCL_ALGO_LEVEL1_NAME_MAP.end(),
60 : HCCL_ERROR("level1: algType1[%u] is invalid.", algType1), HCCL_E_INTERNAL);
61 0 : newTag = tag + level1Iter->second + algName;
62 : }
63 :
64 0 : bool isInlineReduce = IsSupportSDMAReduce(cclBufferManager_.GetInCCLbuffer().ptr(),
65 0 : cclBufferManager_.GetOutCCLbuffer().ptr(), param.VDataDes.dataType, param.reduceType);
66 0 : const std::string REDUCE_SCATTER_V_NO_INLINE = "_no_inline";
67 0 : newTag = isInlineReduce ? newTag : newTag + REDUCE_SCATTER_V_NO_INLINE;
68 0 : }
69 :
70 0 : newTag += (param.aicpuUnfoldMode ? "_device" : "_host");
71 0 : return ret;
72 : }
73 :
74 0 : HcclResult ReduceScatterVOperator::SelectAlgfor91093(const OpParam& param, std::string& algName)
75 : {
76 0 : const auto *countsPtr = static_cast<const u64*>(param.VDataDes.counts);
77 0 : auto countsPerRank = std::vector<u64>(countsPtr, countsPtr + userRankSize_);
78 0 : u64 maxCount = *std::max_element(countsPerRank.begin(), countsPerRank.end());
79 0 : u32 unitSize = SIZE_TABLE[param.VDataDes.dataType];
80 0 : u64 dataSize = maxCount * unitSize; // 单位:字节
81 0 : if (dataSize >= cclBufferManager_.GetInCCLbufferSize()) {
82 0 : HCCL_WARNING("The current inCCLbufferSize is [%llu] bytes, change the HCCL_BUFFSIZE environment variable to "
83 : "be greater than the current data volume[%llu] bytes to improve the performance of the 91093 environment.",
84 : cclBufferManager_.GetInCCLbufferSize(), dataSize);
85 : }
86 :
87 0 : if (multiModuleDiffDeviceNumMode_ || multiSuperPodDiffServerNumMode_) {
88 0 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlgfor91093] not support mode, multiModuleDiffDeviceNumMode_[%u], "
89 : "multiSuperPodDiffServerNumMode_[%u]", multiModuleDiffDeviceNumMode_, multiSuperPodDiffServerNumMode_);
90 0 : return HCCL_E_NOT_SUPPORT;
91 : } else {
92 0 : if (topoType_ == TopoType::TOPO_TYPE_NP_SINGLE_RING) {
93 0 : algName = "ReduceScatterVRingFor91093Executor";
94 0 : } else if (topoType_ == TopoType::TOPO_TYPE_NP_DOUBLE_RING) {
95 0 : const s32 HCCS_PORT_NUM_910_93_7 = 7;
96 0 : if (hccsPortNum_ == HCCS_PORT_NUM_910_93_7) {
97 0 : algName = "ReduceScatterVFastDoubleRingFor91093Executor";
98 : } else {
99 0 : algName = "AlignedReduceScatterVDoubleRingFor91093Executor";
100 : }
101 : } else {
102 0 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlgfor91093] not support topoType_[%u]", topoType_);
103 0 : return HCCL_E_NOT_SUPPORT;
104 : }
105 : }
106 :
107 0 : const bool isWholeRing = (algType_.algoLevel0 == AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING) &&
108 0 : (algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING);
109 0 : if (!(algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_RING || isWholeRing ||
110 0 : algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_NB)) {
111 : // 910_93超节点只支持server间ring,NB和NHR,默认需继续使用NHR
112 0 : algType_.algoLevel1 = AlgTypeLevel1::ALG_LEVEL1_NHR;
113 0 : HCCL_WARNING("[ReduceScatterVOperator][SelectAlgfor91093] only support ring, NB and NHR in AlgoLevel1 yet,"
114 : " default algType is NHR.");
115 : }
116 :
117 0 : HCCL_INFO("[SelectAlgfor91093] ReduceScatterV SelectAlgfor91093 is algName [%s]", algName.c_str());
118 0 : return HCCL_SUCCESS;
119 0 : }
120 :
121 0 : HcclResult ReduceScatterVOperator::SelectAlgfor910B(const OpParam& param, std::string& algName)
122 : {
123 : //图模式切入确定性
124 0 : if (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB && !isSingleMeshAggregation_) {
125 0 : if (!multiModuleDiffDeviceNumMode_) {
126 0 : algName = "ReduceScatterVDeterExecutor";//多机图模式当前默认选中确定性算法
127 0 : if (!(algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_RING ||
128 0 : algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_NB ||
129 0 : algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_NHR)) {
130 : //只支持server间ring,NB和NHR,默认使能NHR
131 0 : algType_.algoLevel1 = AlgTypeLevel1::ALG_LEVEL1_NHR;
132 0 : HCCL_WARNING("[ReduceScatterVOperator][SelectAlgfor910B] only support ring, NB and NHR in AlgoLevel1 yet,"
133 : " default algType is NHR.");
134 : }
135 0 : HCCL_INFO("[SelectAlgfor910B] ReduceScatterV SelectAlgfor910B algName is [%s]", algName.c_str());
136 0 : return HCCL_SUCCESS;
137 : } else {
138 0 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlgfor910B] ReduceScatterV not support uneven devices in multiServer.");
139 0 : return HCCL_E_NOT_SUPPORT;
140 : }
141 : }
142 0 : bool isMeshTopo = topoType_ == TopoType::TOPO_TYPE_NP_MESH || topoType_ == TopoType::TOPO_TYPE_4P_MESH ||
143 0 : topoType_ == TopoType::TOPO_TYPE_2P_MESH || topoType_ == TopoType::TOPO_TYPE_1P_MESH;
144 : // Deterministic 确定性分支
145 0 : bool isDeterministic = topoMatcher_->GetDeterministicConfig() != DETERMINISTIC_DISABLE
146 0 : && isMeshTopo && !multiModuleDiffDeviceNumMode_
147 0 : && (param.VDataDes.dataType == HCCL_DATA_TYPE_FP16
148 0 : || param.VDataDes.dataType == HCCL_DATA_TYPE_FP32
149 0 : || param.VDataDes.dataType == HCCL_DATA_TYPE_BFP16);
150 0 : if (isDeterministic) {
151 : // 只有浮点数存在不确定性
152 0 : algName = "ReduceScatterVDeterExecutor";
153 0 : HCCL_INFO("[SelectAlgfor910B] ReduceScatterV SelectAlgfor910B algName is [%s]", algName.c_str());
154 0 : return HCCL_SUCCESS;
155 : }
156 :
157 : // pipeline算法回退: task数量多,如果超出FFTS子图限制,则重定向到NHR算法
158 0 : if (algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_PIPELINE) {
159 0 : u32 contextNum = CalcContextNumForPipeline(HcclCMDType::HCCL_CMD_REDUCE_SCATTER);
160 0 : if (contextNum > HCCL_FFTS_CAPACITY) {
161 0 : algType_.algoLevel1 = AlgTypeLevel1::ALG_LEVEL1_NHR;
162 0 : HCCL_WARNING("[ReduceScatterVOperator][SelectAlgfor910B] context num[%u] is out of capacity of FFTS+ "\
163 : "graph[%u], reset algorithm to NHR.", contextNum, HCCL_FFTS_CAPACITY);
164 : }
165 : }
166 :
167 : //Pipeline
168 0 : if (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE
169 0 : && algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_PIPELINE
170 0 : && topoMatcher_->GetDeterministicConfig() == DETERMINISTIC_DISABLE
171 0 : && IsMultiMeshInlineReduce(cclBufferManager_.GetInCCLbuffer().ptr(),
172 0 : cclBufferManager_.GetOutCCLbuffer().ptr(), param.VDataDes.dataType, param.reduceType)) {
173 0 : algName = "ReduceScatterVMeshOpbasePipelineExecutor";
174 0 : HCCL_INFO("[SelectAlgfor910B] ReduceScatterV SelectAlgfor910B algName is [%s]", algName.c_str());
175 0 : return HCCL_SUCCESS;
176 : }
177 :
178 0 : const auto *countsPtr = static_cast<const u64*>(param.VDataDes.counts);
179 0 : auto countsPerRank = std::vector<u64>(countsPtr, countsPtr + userRankSize_);
180 0 : u64 maxCount = *std::max_element(countsPerRank.begin(), countsPerRank.end());
181 0 : u32 unitSize = SIZE_TABLE[param.VDataDes.dataType];
182 0 : u64 maxDataSize = maxCount * unitSize; // 单位:字节
183 : // 910B单机AIV模式下ReduceScatterV算子当前仅支持单卡数据量不大于256M的场景,大于256M暂不支持
184 0 : bool isAivMode = (workflowMode_ == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE)
185 0 : && topoMatcher_->GetAivModeConfig()
186 0 : && isSingleMeshAggregation_
187 0 : && maxDataSize <= AIV_BIG_SIZE
188 0 : && IsSupportAIVReduce(param.VDataDes.dataType, param.reduceType)
189 0 : && topoMatcher_->GetDeterministicConfig() == DETERMINISTIC_DISABLE;
190 0 : HCCL_INFO("[ReduceScatterVOperator][SelectAlgfor910B]isAivMode[%d], maxCount[%llu], maxDataSize[%llu], "
191 : "deterministic[%u], isSingleMeshAggregation[%d].", isAivMode, maxCount, maxDataSize,
192 : topoMatcher_->GetDeterministicConfig(), isSingleMeshAggregation_);
193 :
194 0 : if (isAivMode) {
195 0 : if (maxDataSize > AIV_REDUCE_SCATTER_MID_SIZE) {
196 0 : algName = "ReduceScatterVAIVBigCountExecutor";
197 : } else {
198 0 : algName = "ReduceScatterVMeshAivSmallCountExecutor";
199 : }
200 0 : } else if (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE &&
201 0 : IsSupportSDMAReduce(cclBufferManager_.GetInCCLbuffer().ptr(),
202 0 : cclBufferManager_.GetOutCCLbuffer().ptr(), param.VDataDes.dataType, param.reduceType)) {
203 0 : algName = "ReduceScatterVMeshOpbaseExecutor";
204 0 : if (!(algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_RING ||
205 0 : algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_NB ||
206 0 : algType_.algoLevel1 == AlgTypeLevel1::ALG_LEVEL1_NHR)) {
207 : //只支持server间ring,NB和NHR,默认使能NHR
208 0 : algType_.algoLevel1 = AlgTypeLevel1::ALG_LEVEL1_NHR;
209 0 : HCCL_WARNING("[ReduceScatterVOperator][SelectAlgfor910B] only support ring, NB and NHR in AlgoLevel1 yet,"
210 : " default algType is NHR.");
211 : }
212 0 : } else if (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB &&
213 0 : IsSupportSDMAReduce(param.inputPtr, param.outputPtr, param.VDataDes.dataType, param.reduceType)) {
214 0 : algName = "ReduceScatterVMeshExecutor";
215 : } else {
216 0 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlgfor910B] ReduceScatterV only support inlinereduce.");
217 0 : return HCCL_E_NOT_SUPPORT;
218 : }
219 :
220 0 : HCCL_INFO("[SelectAlgfor910B] ReduceScatterV SelectAlgfor910B is algName [%s]", algName.c_str());
221 0 : return HCCL_SUCCESS;
222 0 : }
223 :
224 0 : HcclResult ReduceScatterVOperator::SelectAlgfor310P3(const OpParam& param, std::string& algName)
225 : {
226 : (void) param;
227 0 : CHK_PRT_RET(userRankSize_ > MAX_310P_RANK_SIZE,
228 : HCCL_ERROR("[ReduceScatterVOperator][SelectAlgfor310P3]rankSize[%u] is not supported.ReduceScatterV does not "\
229 : "support the scenario where the rankSize is greater than 4.", userRankSize_), HCCL_E_NOT_SUPPORT);
230 0 : algName = "ReduceScatterVFor310PRing";
231 0 : HCCL_INFO("[SelectAlgfor310P3] ReduceScatterV SelectAlgfor310P3 is algName [%s]", algName.c_str());
232 0 : return HCCL_SUCCESS;
233 : }
234 :
235 : REGISTER_OP(HcclCMDType::HCCL_CMD_REDUCE_SCATTER_V, ReduceScatterV, ReduceScatterVOperator);
236 :
237 : }
|