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 "broadcast_auto_selector.h"
12 : #include "selector_registry.h"
13 : #include "coll_operator.h"
14 :
15 : namespace Hccl {
16 0 : SelectorStatus BroadcastAutoSelector::SelectCcuMsAlgo(const TopoInfo &topoInfo,
17 : const CollAlgOperator &op,
18 : const std::map<OpType, std::vector<HcclAlgoType>> &configAlgMap,
19 : std::string &primQueueGenName) const
20 : {
21 : (void)op;
22 : (void)configAlgMap;
23 0 : HCCL_DEBUG("[BroadcastAutoSelector][%s] start, topoInfo levelNum[%u]", __func__, topoInfo.levelNum);
24 :
25 0 : if (topoInfo.levelNum > 1) {
26 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] levelNum > 1 is not supported yet for ccu_ms mode.");
27 0 : return SelectorStatus::NOT_MATCH;
28 : } else {
29 0 : if (topoInfo.level0Shape == Level0Shape::MESH_1D) {
30 0 : if (Is2DieFullMesh()) {
31 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] 2DieFullMesh is not supported yet for ccu_ms mode.");
32 0 : return SelectorStatus::NOT_MATCH;
33 : } else {
34 0 : primQueueGenName = "CcuBroadcastMesh1D";
35 : }
36 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_2D) {
37 0 : primQueueGenName = "CcuBroadcastMesh2D";
38 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_1D_CLOS) {
39 0 : if (IsLayerAllConnetedWithTopo(topoInfo, 0, TopoType::MESH_1D)) {
40 : // MESH_1D 即可链接所有卡, 使用 MESH_1D 算法
41 0 : primQueueGenName = "CcuBroadcastMesh1D";
42 : } else { // MS 不支持
43 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] level0Shape[%d] is not supported yet for ccu_ms mode.",
44 : topoInfo.level0Shape);
45 0 : return SelectorStatus::NOT_MATCH;
46 : }
47 0 : } else if (topoInfo.level0Shape == Level0Shape::CLOS) {
48 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] level0Shape[%d] is not supported yet for ccu_ms mode.",
49 : topoInfo.level0Shape);
50 0 : return SelectorStatus::NOT_MATCH;
51 : } else {
52 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] level0Shape[%d] is not supported yet for ccu_ms mode.",
53 : topoInfo.level0Shape);
54 0 : return SelectorStatus::NOT_MATCH;
55 : }
56 : }
57 0 : HCCL_INFO("[Algo][BroadcastAutoSelector][%s] Algo match [%s]", __func__, primQueueGenName.c_str());
58 0 : return SelectorStatus::MATCH;
59 : }
60 :
61 0 : SelectorStatus BroadcastAutoSelector::SelectCcuScheduleAlgo(const TopoInfo &topoInfo,
62 : const CollAlgOperator &op,
63 : const std::map<OpType, std::vector<HcclAlgoType>> &configAlgMap,
64 : std::string &primQueueGenName) const
65 : {
66 : (void)op;
67 : (void)configAlgMap;
68 0 : HCCL_DEBUG("[BroadcastAutoSelector][%s] start, topoInfo levelNum[%u]", __func__, topoInfo.levelNum);
69 :
70 0 : if (topoInfo.levelNum > 1) {
71 0 : if (topoInfo.level0Shape == Level0Shape::MESH_1D) {
72 0 : if (topoInfo.netLayerDetails.localNetInsSizeOfLayer[0] == 1) {
73 : // 每框出 1 卡
74 0 : primQueueGenName = "CcuBroadcastNHRMem2Mem1D";
75 0 : } else if (Is2DieFullMesh()) {
76 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] 2DieFullMesh is not supported yet for schedule mode.");
77 0 : return SelectorStatus::NOT_MATCH;
78 : } else {
79 0 : primQueueGenName = "CcuBroadcastParallelMesh1DNHR";
80 : }
81 : } else {
82 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] level0Shape[%d] is not supported yet for ccu schedule mode.",
83 : topoInfo.level0Shape);
84 0 : return SelectorStatus::NOT_MATCH;
85 : }
86 : } else {
87 0 : if (topoInfo.level0Shape == Level0Shape::MESH_1D) {
88 0 : if (Is2DieFullMesh()) {
89 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] 2DieFullMesh is not supported yet for ccu schedule mode.");
90 0 : return SelectorStatus::NOT_MATCH;
91 : } else {
92 0 : primQueueGenName = "CcuBroadcastMeshMem2Mem1D";
93 : }
94 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_2D) {
95 0 : primQueueGenName = "CcuBroadcastMeshMem2Mem2D";
96 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_1D_CLOS) {
97 0 : if (IsLayerAllConnetedWithTopo(topoInfo, 0, TopoType::MESH_1D)) {
98 : // MESH_1D 即可链接所有卡, 使用 MESH_1D 算法
99 0 : primQueueGenName = "CcuBroadcastMeshMem2Mem1D";
100 : } else {
101 0 : primQueueGenName = "CcuBroadcastParallelMesh1DNHR";
102 : }
103 0 : } else if (topoInfo.level0Shape == Level0Shape::CLOS) {
104 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] level0Shape[%d] is not supported yet for ccu schedule mode.",
105 : topoInfo.level0Shape);
106 0 : return SelectorStatus::NOT_MATCH;
107 : } else {
108 0 : HCCL_WARNING("[Algo][BroadcastAutoSelector] level0Shape[%d] is not supported yet for ccu schedule mode.",
109 : topoInfo.level0Shape);
110 0 : return SelectorStatus::NOT_MATCH;
111 : }
112 : }
113 0 : HCCL_INFO("[Algo][BroadcastAutoSelector][%s] Algo match [%s]", __func__, primQueueGenName.c_str());
114 0 : return SelectorStatus::MATCH;
115 : }
116 :
117 0 : SelectorStatus BroadcastAutoSelector::SelectAicpuAlgo(const TopoInfo &topoInfo,
118 : const CollAlgOperator &op,
119 : const std::map<OpType, std::vector<HcclAlgoType>> &configAlgMap,
120 : std::string &primQueueGenName) const
121 : {
122 : (void)configAlgMap;
123 : (void)op;
124 0 : HCCL_DEBUG("[BroadcastAutoSelector][%s] start, topoInfo levelNum[%u]", __func__, topoInfo.levelNum);
125 0 : if (topoInfo.levelNum > 1) {
126 0 : if (topoInfo.level0Shape == Level0Shape::MESH_1D) {
127 0 : primQueueGenName = (topoInfo.netLayerDetails.localNetInsSizeOfLayer[0] == 1) ?"InsBroadcastNHR" : "AiCpuInsBroadcastParallelMesh1DNHR";
128 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_2D) {
129 0 : primQueueGenName = "InsBroadcastNHR";
130 0 : } else if (topoInfo.level0Shape == Level0Shape::CLOS) {
131 0 : primQueueGenName = "InsBroadcastNHR";
132 : } else {
133 0 : return SelectorStatus::NOT_MATCH;
134 : }
135 : } else {
136 0 : if (topoInfo.level0Shape == Level0Shape::MESH_1D) {
137 0 : if(IsSmallData(dataSize_)){
138 0 : primQueueGenName = "InsBroadcastMesh1DOneShot";
139 : } else {
140 0 : primQueueGenName = "InsBroadcastMesh1DTwoShot";
141 : }
142 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_2D) {
143 0 : primQueueGenName = "InsBroadcastMesh2DTwoShot";
144 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_1D_CLOS) {
145 0 : if (IsLayerAllConnetedWithTopo(topoInfo, 0, TopoType::MESH_1D)) {
146 : // MESH_1D 即可链接所有卡, 使用 MESH_1D 算法
147 0 : if(IsSmallData(dataSize_)){
148 0 : primQueueGenName = "InsBroadcastMesh1DOneShot";
149 : } else {
150 0 : primQueueGenName = "InsBroadcastMesh1DTwoShot";
151 : }
152 : } else {
153 0 : if (topoInfo.level0PcieMix) {// 预留PCIE mix入口,如果要更新算法可以直接改
154 0 : primQueueGenName = "InsBroadcastParallelMesh1DNHRPcie";
155 : } else {
156 0 : primQueueGenName = "AiCpuInsBroadcastParallelMesh1DNHR";
157 : }
158 : }
159 0 : } else if (topoInfo.level0Shape == Level0Shape::CLOS) {
160 0 : primQueueGenName = "InsBroadcastNHR";
161 : } else {
162 0 : HCCL_WARNING("[BroadcastAutoSelector] topo not match");
163 0 : return SelectorStatus::NOT_MATCH;
164 : }
165 : }
166 0 : HCCL_INFO("[Algo][BroadcastAutoSelector][%s] Algo match [%s]", __func__, primQueueGenName.c_str());
167 0 : return SelectorStatus::MATCH;
168 : }
169 :
170 0 : SelectorStatus BroadcastAutoSelector::SelectMeshAlgoAicpu(const TopoInfo &topoInfo,
171 : const CollAlgOperator &op,
172 : std::string &primQueueGenName) const
173 : {
174 : (void)topoInfo;
175 : (void)op;
176 0 : if (topoInfo.level0Shape == Level0Shape::MESH_1D) {
177 0 : if(IsSmallData(dataSize_)){
178 0 : primQueueGenName = "InsBroadcastMesh1DOneShot";
179 : } else {
180 0 : primQueueGenName = "InsBroadcastMesh1DTwoShot";
181 : }
182 0 : } else if (topoInfo.level0Shape == Level0Shape::MESH_2D) {
183 0 : primQueueGenName = "InsBroadcastMesh2DTwoShot";
184 0 : } else if (topoInfo.level0Shape == Level0Shape::CLOS) {
185 0 : primQueueGenName = "InsBroadcastNHR";
186 : } else {
187 0 : HCCL_WARNING("[BroadcastAutoSelector] topo not match");
188 0 : return SelectorStatus::NOT_MATCH;
189 : }
190 0 : return SelectorStatus::MATCH;
191 : }
192 :
193 0 : SelectorStatus BroadcastAutoSelector::SelectAivAlgo(const TopoInfo &topoInfo,
194 : const CollAlgOperator &op,
195 : const std::map<OpType, std::vector<HcclAlgoType>> &configAlgMap,
196 : std::string &primQueueGenName) const
197 : {
198 : (void)op;
199 : (void)configAlgMap;
200 0 : HCCL_DEBUG("[BroadcastAutoSelector][%s] start, topoInfo levelNum[%u]", __func__, topoInfo.levelNum);
201 :
202 : // aiv 直接走打平 mesh
203 0 : primQueueGenName = "AivBroadcastMesh1D";
204 :
205 0 : HCCL_INFO("[Algo][BroadcastAutoSelector][%s] Algo match [%s]", __func__, primQueueGenName.c_str());
206 0 : return SelectorStatus::MATCH;
207 : }
208 :
209 : REGISTER_SELECTOR_BY_OPTYPE(OpType::BROADCAST, 18, BroadcastAutoSelector);
210 : } // namespace Hccl
|