LCOV - code coverage report
Current view: top level - legacy/ascend910/common/debug/profiling/inc - task_profiling_pub.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 76.7 % 30 23
Test Date: 2026-08-18 17:47:01 Functions: 80.0 % 5 4

            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 */
        

Generated by: LCOV version 2.0-1