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 TASK_PROFILING_PUB_H
12 : #define TASK_PROFILING_PUB_H
13 :
14 : #include <chrono>
15 : #include <memory>
16 : #include <mutex>
17 : #include <string>
18 : #include <map>
19 : #include <queue>
20 : #include <hccl/hccl_types.h>
21 :
22 : #include "hccl/base.h"
23 : #include "profiler_base_pub.h"
24 : #include "adapter_prof.h"
25 : #include "prof_common.h"
26 :
27 : namespace hccl {
28 : constexpr u64 SHIFT_BITS_PLANE_ID = 28;
29 : constexpr u64 SHIFT_BITS_RANK_SIZE = 16;
30 : constexpr u64 SHIFT_BITS_RANK = 0;
31 :
32 : constexpr u64 MASK_PLANE_ID = 0xF;
33 : constexpr u64 MASK_RANK_SIZE = 0xFFF;
34 : constexpr u64 MASK_RANK = 0xFFFF;
35 : constexpr u64 INVALID_U64_PROF = 0xFFFFFFFFFFFFFFFF;
36 : constexpr u64 OP_CALLED_COUNT_LIMIT = 1000000;
37 :
38 : #define PARSE_PLANE_ID(id) (((static_cast<u64>(id)) >> SHIFT_BITS_PLANE_ID) & MASK_PLANE_ID)
39 : #define PARSE_RANK(id) (((static_cast<u64>(id)) >> SHIFT_BITS_RANK) & MASK_RANK)
40 : #define PARSE_RANK_SIZE(id) (((static_cast<u64>(id)) >> SHIFT_BITS_RANK_SIZE) & MASK_RANK_SIZE)
41 :
42 : constexpr u64 ENGINE_MAX_TAG_LEN = 31;
43 : /* *
44 : * @name ProfReporterData
45 : * @brief struct of data to report
46 : */
47 : struct ProfReporterData {
48 : char tag[ENGINE_MAX_TAG_LEN + 1]; // the sub-type of the module, data with different tag will be written
49 : u32 deviceId; // the index of device
50 : size_t dataLen; // the length of send data
51 : u8* data; // the data content
52 : };
53 :
54 : struct TaskData {
55 : u32 streamID;
56 : u32 taskID;
57 :
58 : TaskType taskType;
59 :
60 : TaskParaDMA DMA; // taskType = SDMA/RDMA使用, 包括rtRDMASend写notify
61 : TaskParaReduce Reduce; // taskType = inline/CCE Reduce使用
62 : TaskParaNotify Notify; // taskType = Noitfy Record/Wait使用
63 : TaskParaAiv Aiv; // taskType = Aiv 使用
64 :
65 : TaskData() : streamID(-1), taskID(-1), taskType(TaskType::TASK_SDMA) {}
66 32 : TaskData(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaDMA& para)
67 32 : : streamID(streamID),
68 32 : taskID(taskID),
69 32 : taskType(taskType),
70 32 : DMA(para)
71 32 : {}
72 9 : TaskData(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaReduce& para)
73 9 : : streamID(streamID),
74 9 : taskID(taskID),
75 9 : taskType(taskType),
76 9 : Reduce(para)
77 9 : {}
78 0 : TaskData(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaNotify& para)
79 0 : : streamID(streamID),
80 0 : taskID(taskID),
81 0 : taskType(taskType),
82 0 : Notify(para)
83 0 : {}
84 : TaskData(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaAiv& para)
85 : : streamID(streamID),
86 : taskID(taskID),
87 : taskType(taskType),
88 : Aiv(para)
89 : {}
90 : };
91 :
92 : struct HCCLReportData {
93 : std::string fileTag;
94 : uint64_t ts;
95 : uint32_t type;
96 : MsprofHcclInfo profInfo;
97 : std::string tag;
98 : std::string groupName;
99 : };
100 :
101 : enum class ProfTaskType {
102 : TASK_HCCL_INFO = 0,
103 : TASK_SDMA,
104 : TASK_RDMA,
105 : TASK_REDUCE_INLINE,
106 : TASK_REDUCE_TBE,
107 : TASK_NOTIFY_RECORD,
108 : TASK_NOTIFY_WAIT,
109 : TASK_STAGEX_STEPX,
110 : TASK_FLAG,
111 : TASK_END,
112 : TASK_MULTI_THREAD,
113 : TASK_LAUNCH_FFTS_TASK,
114 : TASK_AIV,
115 : TASK_DPU_HCCL_INFO, // 用于区分DPU侧上报的HCCL信息和Host侧上报的HCCL信息
116 :
117 : TASK_ISET_LOOKUP_RESPONSE,
118 : TASK_WAIT_SOME,
119 : TASK_GET_LOOKUP_REQUEST,
120 : TASK_COLL_RECV_LOOKUP_REQUEST,
121 : TASK_COLL_RECV_UPDATE_REQUEST,
122 : TASK_ISEND_UPDATE_RESPONSE,
123 : TASK_ISEND_LOOKUP_RESPONSE,
124 :
125 : // update
126 : TASK_UPDATE_IMRECV,
127 : TASK_UPDATE_GLOBAL_REDUCE,
128 :
129 : // new
130 : TASK_LOOKUP_RESPONSE_MEMCPY,
131 : TASK_LOOKUP_RESPONSE_ISEND,
132 : TASK_SHARE_MEMORY_ISEND_RECORD,
133 :
134 : TASK_ABORT_SELF,
135 : TASK_SERVICE_CANCEL,
136 : TASK_DESTROY_RESOURCE,
137 : TASK_EVENT_WAIT,
138 :
139 : // npu lookup
140 : TASK_KEY_DROP_DUPLICATES,
141 : TASK_SEND_KEYS,
142 : TASK_SEND_KEYS_RECORD,
143 : TASK_EVENT_WAIT_RECV_DONE,
144 : TASK_RESET_UNIQUE_HANDLE,
145 : TASK_EVENT_WAIT_SEND_DONE,
146 : TASK_RECV_VALUES,
147 : TASK_RECOVER_VALUE_AICORE,
148 : TASK_GATHER_FINISH,
149 :
150 : // npu update
151 : TASK_REMOTE_UPDATE_KEY_REDUCE,
152 : TASK_VALUE_CLEAR_AICORE,
153 : TASK_VALUE_REDUCE_SUM_AICORE,
154 : TASK_REMOTE_UPDATE_SEND_REQUEST,
155 : TASK_UPDATE_RESET_UNIQUE_HANDLE,
156 : TASK_NOTIFY_REMOTE_IMRECV_DONE_SIGNAL_KEY,
157 : TASK_NOTIFY_REMOTE_IMRECV_DONE_SIGNAL_VALUE,
158 : TASK_REMOTE_UPDATE_RECV_RESPONSE,
159 :
160 : TASK_BUILD_CS_TRANSPORT,
161 : TASK_UPDATE_ALG_GLOBAL_REDUCE,
162 : TASK_INTER_PROCESSOR_SYNC,
163 : TASK_INTER_RANK_RECORD,
164 : TASK_INVALID
165 : };
166 :
167 : const std::map<ProfTaskType, std::string> PROF_TASK_OP_NAME
168 : = {{ProfTaskType::TASK_HCCL_INFO, "hccl_info"},
169 : {ProfTaskType::TASK_DPU_HCCL_INFO, "dpu_hccl_info"},
170 : {ProfTaskType::TASK_SDMA, "Memcpy"},
171 : {ProfTaskType::TASK_RDMA, "RDMASend"},
172 : {ProfTaskType::TASK_REDUCE_INLINE, "Reduce_Inline"},
173 : {ProfTaskType::TASK_REDUCE_TBE, "Reduce_TBE"},
174 : {ProfTaskType::TASK_NOTIFY_RECORD, "Notify_Record"},
175 : {ProfTaskType::TASK_NOTIFY_WAIT, "Notify_Wait"},
176 : {ProfTaskType::TASK_STAGEX_STEPX, "StageX_StepX"},
177 : {ProfTaskType::TASK_FLAG, "Flag"},
178 : {ProfTaskType::TASK_END, "End"},
179 : {ProfTaskType::TASK_MULTI_THREAD, "Multi_Thread"},
180 : {ProfTaskType::TASK_LAUNCH_FFTS_TASK, "Launch_Ffts"},
181 : {ProfTaskType::TASK_AIV, "AivKernel"},
182 :
183 : {ProfTaskType::TASK_WAIT_SOME, "Wait_Some"},
184 : {ProfTaskType::TASK_COLL_RECV_LOOKUP_REQUEST, "Coll_Recv_Lookup_Request"},
185 : {ProfTaskType::TASK_COLL_RECV_UPDATE_REQUEST, "Coll_Recv_Update_Request"},
186 : {ProfTaskType::TASK_ISEND_UPDATE_RESPONSE, "Isend_Update_Response"},
187 : {ProfTaskType::TASK_ISEND_LOOKUP_RESPONSE, "Isend_Lookup_Response"},
188 :
189 : // RemoteUpdate 使用
190 : {ProfTaskType::TASK_UPDATE_IMRECV, "Update_Imrecv"},
191 : {ProfTaskType::TASK_UPDATE_GLOBAL_REDUCE, "Update_Global_Reduce"},
192 :
193 : // RemoteLookup 使用
194 : {ProfTaskType::TASK_LOOKUP_RESPONSE_MEMCPY, "Lookup_Response_Memcpy"},
195 : {ProfTaskType::TASK_LOOKUP_RESPONSE_ISEND, "Lookup_Response_Isend"},
196 :
197 : // SHM 使用
198 : {ProfTaskType::TASK_SHARE_MEMORY_ISEND_RECORD, "Share_Memory_Isend_Record"},
199 :
200 : {ProfTaskType::TASK_ABORT_SELF, "Abort_Self"},
201 : {ProfTaskType::TASK_SERVICE_CANCEL, "Service_Cancel"},
202 : {ProfTaskType::TASK_DESTROY_RESOURCE, "Destroy_Resource"},
203 : {ProfTaskType::TASK_EVENT_WAIT, "Event_Wait"},
204 :
205 : {ProfTaskType::TASK_KEY_DROP_DUPLICATES, "Key_Drop_Duplicates"},
206 : {ProfTaskType::TASK_SEND_KEYS, "Send_Keys"},
207 : {ProfTaskType::TASK_SEND_KEYS_RECORD, "Send_Keys_Record"},
208 : {ProfTaskType::TASK_EVENT_WAIT_RECV_DONE, "Event_Wait_Recv_Done"},
209 : {ProfTaskType::TASK_RESET_UNIQUE_HANDLE, "Reset_Unique_Handle"},
210 : {ProfTaskType::TASK_EVENT_WAIT_SEND_DONE, "Event_Wait_Send_Done"},
211 : {ProfTaskType::TASK_RECV_VALUES, "Recv_Values"},
212 : {ProfTaskType::TASK_RECOVER_VALUE_AICORE, "Recover_value_Aicore"},
213 : {ProfTaskType::TASK_GATHER_FINISH, "Gather_Finish"},
214 :
215 : {ProfTaskType::TASK_REMOTE_UPDATE_KEY_REDUCE, "Remote_Update_Key_Reduce"},
216 : {ProfTaskType::TASK_VALUE_CLEAR_AICORE, "Value_Clear_Aicore"},
217 : {ProfTaskType::TASK_VALUE_REDUCE_SUM_AICORE, "Value_Reduce_Sum_Aicore"},
218 : {ProfTaskType::TASK_REMOTE_UPDATE_SEND_REQUEST, "Remote_Update_Send_Request"},
219 : {ProfTaskType::TASK_UPDATE_RESET_UNIQUE_HANDLE, "Update_Reset_Unique_Handle"},
220 : {ProfTaskType::TASK_NOTIFY_REMOTE_IMRECV_DONE_SIGNAL_KEY, "Notify_Remote_Imrecv_Done_Signal_Key"},
221 : {ProfTaskType::TASK_NOTIFY_REMOTE_IMRECV_DONE_SIGNAL_VALUE, "Notify_Remote_Imrecv_Done_Signal_Value"},
222 : {ProfTaskType::TASK_REMOTE_UPDATE_RECV_RESPONSE, "Remote_Update_Recv_Response"},
223 :
224 : {ProfTaskType::TASK_BUILD_CS_TRANSPORT, "Build_Cs_Transport"},
225 : {ProfTaskType::TASK_UPDATE_ALG_GLOBAL_REDUCE, "Update_Glg_Global_Reduce"},
226 : {ProfTaskType::TASK_INTER_PROCESSOR_SYNC, "Inter_Processor_Sync"},
227 : {ProfTaskType::TASK_INTER_RANK_RECORD, "Inter_Rank_Record"},
228 : {ProfTaskType::TASK_INVALID, "unknown"}};
229 :
230 1584 : inline std::string GetProfTaskOpName(ProfTaskType type)
231 : {
232 1584 : CHK_PRT_RET(PROF_TASK_OP_NAME.empty(), HCCL_ERROR("PROF_OP_NAME has not inited."), "invalid");
233 1584 : auto it = PROF_TASK_OP_NAME.find(type);
234 1584 : if (it != PROF_TASK_OP_NAME.end()) {
235 1580 : return it->second;
236 : }
237 8 : return "unknown";
238 : }
239 :
240 : const std::map<HcclCMDType, std::string> PROF_OP_NAME
241 : = {{HcclCMDType::HCCL_CMD_INVALID, "hcom_invalid_"},
242 : {HcclCMDType::HCCL_CMD_BROADCAST, "hcom_broadcast_"},
243 : {HcclCMDType::HCCL_CMD_ALLREDUCE, "hcom_allReduce_"},
244 : {HcclCMDType::HCCL_CMD_REDUCE, "hcom_reduce_"},
245 : {HcclCMDType::HCCL_CMD_SEND, "hcom_send_"},
246 : {HcclCMDType::HCCL_CMD_RECEIVE, "hcom_receive_"},
247 : {HcclCMDType::HCCL_CMD_ALLGATHER, "hcom_allGather_"},
248 : {HcclCMDType::HCCL_CMD_REDUCE_SCATTER, "hcom_reduceScatter_"},
249 : {HcclCMDType::HCCL_CMD_SCATTER, "hcom_scatter_"},
250 : {HcclCMDType::HCCL_CMD_ALLTOALL, "hcom_alltoall_"},
251 : {HcclCMDType::HCCL_CMD_ALLTOALLV, "hcom_alltoallv_"},
252 : {HcclCMDType::HCCL_CMD_ALLGATHER_V, "hcom_allGatherv_"},
253 : {HcclCMDType::HCCL_CMD_REDUCE_SCATTER_V, "hcom_reduceScatterv_"},
254 : {HcclCMDType::HCCL_CMD_ALLTOALLVC, "hcom_alltoallvc_"},
255 : {HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, "hcom_batchSendRecv_"},
256 : {HcclCMDType::HCCL_CMD_BATCH_PUT, "hccl_batchPut_"},
257 : {HcclCMDType::HCCL_CMD_BATCH_GET, "hccl_batchGet_"}};
258 :
259 13 : inline std::string GetProfOpName(HcclCMDType cmdType)
260 : {
261 13 : CHK_PRT_RET(PROF_OP_NAME.empty(), HCCL_ERROR("PROF_OP_NAME has not inited."), "hcom_ivalid_");
262 13 : auto it = PROF_OP_NAME.find(cmdType);
263 13 : if (it != PROF_OP_NAME.end()) {
264 13 : return it->second;
265 : }
266 0 : return PROF_OP_NAME.begin()->second;
267 : }
268 :
269 : class TaskProfiling : public ProfilerBase {
270 : public:
271 : /* * 当前Profling只有注册接口, 生命期需要贯穿整个进程, 故选择静态成员变量
272 : 多线程操作相同reporter_对象需要加锁 */
273 : static std::mutex mutex_;
274 :
275 : public:
276 : explicit TaskProfiling(u32 deviceLogicId_, u32 localRank_, u32 rankSize_, bool profilingOn = true);
277 : ~TaskProfiling() override;
278 :
279 : public:
280 : HcclResult Run(const std::string& opName, const std::string& tag) const;
281 : HcclResult Run(const StepData& stepData) override;
282 : HcclResult Flush() override;
283 : HcclResult Save(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaDMA& paraDMA) override;
284 : HcclResult Save(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaReduce& paraReduce) override;
285 : HcclResult Save(u32& streamID, u32& taskID, TaskType& taskType, const TaskParaNotify& paraNotify) override;
286 : HcclResult Save(u32 streamID, u32 taskID, const TaskParaAiv& paraAiv) override;
287 : HcclResult Save(u32& streamID, u32& taskID, const void* descBuf = nullptr, size_t descBufLen = 0) override;
288 : HcclResult SaveToLog(const TaskParaHost& paraHost) override;
289 : HcclResult
290 : Save(u32 captureStreamID, u32 streamID, u32 taskID, TaskType& taskType, const TaskParaDMA& para) override;
291 : HcclResult
292 : Save(u32 captureStreamID, u32 streamID, u32 taskID, TaskType& taskType, const TaskParaReduce& para) override;
293 : HcclResult
294 : Save(u32 captureStreamID, u32 streamID, u32 taskID, TaskType& taskType, const TaskParaNotify& para) override;
295 : HcclResult
296 : Save(u32 captureStreamID, u32 streamID, u32 taskID, const void* descBuf = nullptr, size_t descBufLen = 0) override;
297 : HcclResult Save(u32 captureStreamID, u32 streamID, u32 taskID, const TaskParaAiv& paraAiv) override;
298 :
299 : static void DumpReportDataInfo(uint32_t type, const MsprofHcclInfo& profInfo);
300 :
301 : static HcclResult ReportMsprofData(HCCLReportData& hcclReportData);
302 :
303 : protected:
304 : private:
305 : HcclResult Run(const TaskData& taskData, bool isCapture = false);
306 : u64 TimestampNanosecond() const;
307 :
308 : HcclResult Report(struct ProfReporterData& data);
309 :
310 : ProfTaskType GetProfTaskType(TaskType taskType) const;
311 : double GetTaskTime(TaskType taskType, const TaskData& taskData) const;
312 : void GetTaskData(TaskType taskType, const TaskData& taskData, struct MsprofHcclInfo& taskInfo);
313 : void GetSdmaTaskData(TaskType taskType, const TaskData& taskData, struct MsprofHcclInfo& taskInfo) const;
314 : void GetRdmaTaskData(TaskType taskType, const TaskData& taskData, struct MsprofHcclInfo& taskInfo) const;
315 : void GetReduceTaskData(TaskType taskType, const TaskData& taskData, struct MsprofHcclInfo& taskInfo) const;
316 : void GetNotifyTaskData(TaskType taskType, const TaskData& taskData, struct MsprofHcclInfo& taskInfo) const;
317 : uint32_t GetTransportType(TaskType taskType) const;
318 : uint32_t GetTaskRole(TaskType taskType) const;
319 :
320 : private:
321 : const u32 localRank_;
322 : const u32 rankSize_;
323 : bool profilingOn_; // 当前无条件启动profiling
324 : };
325 : } // namespace hccl
326 :
327 : #endif /* TASK_PROFILING_PUB_H */
|