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 "coll_operator_check.h"
12 : #include "exception_util.h"
13 : #include "adapter_error_manager_pub.h"
14 :
15 : namespace Hccl {
16 :
17 13 : void ReportOpCheckFailed(const std::string ¶Name, const std::string &localPara, const std::string &remotePara, const OpType& optype, const std::string& optag)
18 : {
19 13 : std::string opInfo = "Unknown";
20 38 : for (const auto& pair : HCOM_OP_TYPE_STR_MAP_V2) {
21 38 : if (pair.second == optype) {
22 13 : opInfo = std::string(pair.first);
23 13 : break;
24 : }
25 : }
26 : // 上报故障码EI0005
27 13 : RPT_INPUT_ERR(true, "EI0005", std::vector<std::string>({"ccl_op", "group", "para_name", "local_para", "remote_para"}),
28 : std::vector<std::string>({opInfo, optag, paraName, localPara, remotePara}));
29 26 : THROW<InvalidParamsException>(StringFormat(
30 : "[RankConsistentImpl][CompareFrame][%s]op information%s group%s %s check fail. "
31 : "local[%s], remote[%s]", __func__, opInfo.c_str(), optag.c_str(), paraName.c_str(), localPara.c_str(), remotePara.c_str()));
32 13 : }
33 :
34 9 : void ReportOpCheckFailed(const std::string ¶Name, uint32_t localPara, uint32_t remotePara, const OpType& optype, const std::string& optag)
35 : {
36 9 : std::string opInfo = "Unknown";
37 34 : for (const auto& pair : HCOM_OP_TYPE_STR_MAP_V2) {
38 34 : if (pair.second == optype) {
39 9 : opInfo = std::string(pair.first);
40 9 : break;
41 : }
42 : }
43 : // 上报故障码EI0005
44 9 : RPT_INPUT_ERR(true, "EI0005", std::vector<std::string>({"ccl_op", "group", "para_name", "local_para", "remote_para"}),
45 : std::vector<std::string>({opInfo, optag, paraName, std::to_string(localPara), std::to_string(remotePara)}));
46 18 : THROW<InvalidParamsException>(StringFormat(
47 : "[RankConsistentImpl][CompareFrame][%s]op information%s group%s %s check fail. "
48 : "local[%u], remote[%u]", __func__, opInfo.c_str(), optag.c_str(), paraName.c_str(), localPara, remotePara));
49 9 : }
50 :
51 6 : void CompareDataDesOp(const CollOperator &localOpData, const CollOperator &remoteOpData)
52 : {
53 6 : if (localOpData.dataDes.dataCount != remoteOpData.dataDes.dataCount) {
54 3 : ReportOpCheckFailed("dataDes.dataCount", localOpData.dataDes.dataCount, remoteOpData.dataDes.dataCount, localOpData.opType, localOpData.opTag);
55 : }
56 :
57 5 : if (localOpData.dataDes.dataType != remoteOpData.dataDes.dataType) {
58 4 : ReportOpCheckFailed("dataDes.dataType", localOpData.dataDes.dataType.Describe(),
59 3 : remoteOpData.dataDes.dataType.Describe(), localOpData.opType, localOpData.opTag);
60 : }
61 :
62 4 : if (localOpData.dataDes.strideCount != remoteOpData.dataDes.strideCount) {
63 3 : ReportOpCheckFailed("dataDes.strideCount", localOpData.dataDes.strideCount, remoteOpData.dataDes.strideCount, localOpData.opType, localOpData.opTag);
64 : }
65 3 : }
66 :
67 2 : void CompareVDataDesOp(const CollOperator &localOpData, const CollOperator &remoteOpData)
68 : {
69 2 : if (localOpData.vDataDes.dataType != remoteOpData.vDataDes.dataType) {
70 4 : ReportOpCheckFailed("vDataDes.dataType", localOpData.vDataDes.dataType.Describe(),
71 2 : remoteOpData.vDataDes.dataType.Describe(), localOpData.opType, localOpData.opTag);
72 : }
73 1 : }
74 :
75 5 : void CompareAlltoAllOp(const CollOperator &localOpData, const CollOperator &remoteOpData)
76 : {
77 5 : if (localOpData.all2AllDataDes.sendType != remoteOpData.all2AllDataDes.recvType) {
78 4 : ReportOpCheckFailed("all2AllDataDes.sendType", localOpData.all2AllDataDes.sendType.Describe(),
79 3 : remoteOpData.all2AllDataDes.recvType.Describe(), localOpData.opType, localOpData.opTag);
80 : }
81 :
82 4 : if (localOpData.all2AllDataDes.recvType != remoteOpData.all2AllDataDes.sendType) {
83 4 : ReportOpCheckFailed("all2AllDataDes.recvType", localOpData.all2AllDataDes.recvType.Describe(),
84 3 : remoteOpData.all2AllDataDes.sendType.Describe(), localOpData.opType, localOpData.opTag);
85 : }
86 :
87 3 : if (localOpData.all2AllDataDes.sendCount != remoteOpData.all2AllDataDes.recvCount) {
88 2 : ReportOpCheckFailed("all2AllDataDes.sendCount", localOpData.all2AllDataDes.sendCount,
89 2 : remoteOpData.all2AllDataDes.recvCount, localOpData.opType, localOpData.opTag);
90 : }
91 :
92 2 : if (localOpData.all2AllDataDes.recvCount != remoteOpData.all2AllDataDes.sendCount) {
93 2 : ReportOpCheckFailed("all2AllDataDes.recvCount", localOpData.all2AllDataDes.recvCount,
94 1 : remoteOpData.all2AllDataDes.sendCount, localOpData.opType, localOpData.opTag);
95 : }
96 1 : }
97 :
98 3 : void CompareAlltoAllVOp(const CollOperator &localOpData, const CollOperator &remoteOpData)
99 : {
100 3 : if (localOpData.all2AllVDataDes.sendType != remoteOpData.all2AllVDataDes.recvType) {
101 4 : ReportOpCheckFailed("all2AllVDataDes.sendType", localOpData.all2AllVDataDes.sendType.Describe(),
102 3 : remoteOpData.all2AllVDataDes.recvType.Describe(), localOpData.opType, localOpData.opTag);
103 : }
104 :
105 2 : if (localOpData.all2AllVDataDes.recvType != remoteOpData.all2AllVDataDes.sendType) {
106 4 : ReportOpCheckFailed("all2AllVDataDes.recvType", localOpData.all2AllVDataDes.recvType.Describe(),
107 2 : remoteOpData.all2AllVDataDes.sendType.Describe(), localOpData.opType, localOpData.opTag);
108 : }
109 1 : }
110 :
111 3 : void CompareAlltoAllVCOp(const CollOperator &localOpData, const CollOperator &remoteOpData)
112 : {
113 3 : if (localOpData.all2AllVCDataDes.sendType != remoteOpData.all2AllVCDataDes.recvType) {
114 4 : ReportOpCheckFailed("all2AllVCDataDes.sendType", localOpData.all2AllVCDataDes.sendType.Describe(),
115 3 : remoteOpData.all2AllVCDataDes.recvType.Describe(), localOpData.opType, localOpData.opTag);
116 : }
117 :
118 2 : if (localOpData.all2AllVCDataDes.recvType != remoteOpData.all2AllVCDataDes.sendType) {
119 4 : ReportOpCheckFailed("all2AllVCDataDes.recvType", localOpData.all2AllVCDataDes.recvType.Describe(),
120 2 : remoteOpData.all2AllVCDataDes.sendType.Describe(), localOpData.opType, localOpData.opTag);
121 : }
122 1 : }
123 :
124 29 : void CompareNormalOp(const CollOperator &localOpData, const CollOperator &remoteOpData)
125 : {
126 29 : if (localOpData.opMode != remoteOpData.opMode) {
127 0 : ReportOpCheckFailed("opMode", localOpData.opMode.Describe(), remoteOpData.opMode.Describe(), localOpData.opType, localOpData.opTag);
128 : }
129 :
130 29 : if (localOpData.opType == OpType::SEND) {
131 2 : if (remoteOpData.opType != OpType::RECV) {
132 0 : ReportOpCheckFailed("opType", localOpData.opType.Describe(), remoteOpData.opType.Describe(), localOpData.opType, localOpData.opTag);
133 : }
134 27 : } else if (localOpData.opType == OpType::RECV) {
135 0 : if (remoteOpData.opType != OpType::SEND) {
136 0 : ReportOpCheckFailed("opType", localOpData.opType.Describe(), remoteOpData.opType.Describe(), localOpData.opType, localOpData.opTag);
137 : }
138 27 : } else if (localOpData.opType != remoteOpData.opType) {
139 5 : ReportOpCheckFailed("opType", localOpData.opType.Describe(), remoteOpData.opType.Describe(), localOpData.opType, localOpData.opTag);
140 : }
141 :
142 28 : if (localOpData.reduceOp != remoteOpData.reduceOp) {
143 5 : ReportOpCheckFailed("reduceOp", localOpData.reduceOp.Describe(), remoteOpData.reduceOp.Describe(), localOpData.opType, localOpData.opTag);
144 : }
145 :
146 27 : if (localOpData.dataType != remoteOpData.dataType) {
147 5 : ReportOpCheckFailed("dataType", localOpData.dataType.Describe(), remoteOpData.dataType.Describe(), localOpData.opType, localOpData.opTag);
148 : }
149 :
150 26 : if (localOpData.opType != OpType::ALLGATHERV && localOpData.opType != OpType::REDUCESCATTERV) {
151 24 : if (localOpData.dataCount != remoteOpData.dataCount) {
152 3 : ReportOpCheckFailed("dataCount", localOpData.dataCount, remoteOpData.dataCount, localOpData.opType, localOpData.opTag);
153 : }
154 : }
155 :
156 25 : if (localOpData.root != remoteOpData.root) {
157 3 : ReportOpCheckFailed("root", localOpData.root, remoteOpData.root, localOpData.opType, localOpData.opTag);
158 : }
159 :
160 24 : if (localOpData.opType == OpType::SEND || localOpData.opType == OpType::RECV) {
161 2 : if (localOpData.myRank != remoteOpData.sendRecvRemoteRank) {
162 3 : ReportOpCheckFailed("sendRecvRemoteRank", localOpData.myRank, remoteOpData.sendRecvRemoteRank, localOpData.opType, localOpData.opTag);
163 : }
164 : }
165 :
166 23 : if (localOpData.opTag != remoteOpData.opTag) {
167 3 : ReportOpCheckFailed("opTag", localOpData.opTag, remoteOpData.opTag, localOpData.opType, localOpData.opTag);
168 : }
169 :
170 22 : if (localOpData.staticAddr != remoteOpData.staticAddr) {
171 2 : ReportOpCheckFailed("staticAddr",
172 1 : static_cast<uint32_t>(localOpData.staticAddr), static_cast<uint32_t>(remoteOpData.staticAddr), localOpData.opType, localOpData.opTag);
173 : }
174 :
175 21 : if (localOpData.staticShape != remoteOpData.staticShape) {
176 2 : ReportOpCheckFailed("staticShape",
177 1 : static_cast<uint32_t>(localOpData.staticShape), static_cast<uint32_t>(remoteOpData.staticShape), localOpData.opType, localOpData.opTag);
178 : }
179 :
180 20 : if (localOpData.outputDataType != remoteOpData.outputDataType) {
181 4 : ReportOpCheckFailed("outputDataType", localOpData.outputDataType.Describe(),
182 2 : remoteOpData.outputDataType.Describe(), localOpData.opType, localOpData.opTag);
183 : }
184 19 : }
185 :
186 : /*
187 : 当前校验类型不支持vDataDes和all2AllVCDataDes相关内容;batchSendRecvDataDes中的itemNum字段没有校验的必要,双端该值可能不相等
188 : */
189 29 : void CheckCollOperator(const CollOperator &localOpData, const CollOperator &remoteOpData)
190 : {
191 29 : CompareNormalOp(localOpData, remoteOpData);
192 :
193 19 : if (localOpData.opType == OpType::BATCHSENDRECV) {
194 0 : return;
195 : }
196 :
197 19 : if (localOpData.opType == OpType::ALLTOALL) {
198 5 : CompareAlltoAllOp(localOpData, remoteOpData);
199 1 : return;
200 : }
201 :
202 14 : if (localOpData.opType == OpType::ALLTOALLV) {
203 3 : CompareAlltoAllVOp(localOpData, remoteOpData);
204 1 : return;
205 : }
206 :
207 11 : if (localOpData.opType == OpType::ALLTOALLVC) {
208 3 : CompareAlltoAllVCOp(localOpData, remoteOpData);
209 1 : return;
210 : }
211 :
212 8 : if (localOpData.opType == OpType::ALLGATHERV || localOpData.opType == OpType::REDUCESCATTERV) {
213 2 : CompareVDataDesOp(localOpData, remoteOpData);
214 1 : return;
215 : }
216 :
217 6 : CompareDataDesOp(localOpData, remoteOpData);
218 3 : return;
219 : }
220 : } // namesapce Hccl
|