LCOV - code coverage report
Current view: top level - legacy/ascend910/framework/device/debug/dfx/profiling - profiling_extend_info.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 80.8 % 78 63
Test Date: 2026-08-18 17:47:01 Functions: 100.0 % 10 10

            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 <sstream>
      12              : #include <unordered_map>
      13              : #include "common/aicpu_sqe_context.h"
      14              : #include "task_profiling_pub.h"
      15              : #include "common/aicpu_hccl_common.h"
      16              : #include "profiling_manager_device.h"
      17              : #include "profiling_extend_info.h"
      18              : 
      19              : namespace dfx {
      20              : uint64_t g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_INVALID)];
      21              : const std::vector<hccl::ProfTaskType> kfcTaskTypes
      22              :     = {hccl::ProfTaskType::TASK_HCCL_INFO, // 当前未支持的用这个来暂替
      23              :        hccl::ProfTaskType::TASK_NOTIFY_RECORD,
      24              :        hccl::ProfTaskType::TASK_NOTIFY_WAIT,
      25              :        hccl::ProfTaskType::TASK_SDMA,
      26              :        hccl::ProfTaskType::TASK_INTER_RANK_RECORD,
      27              :        hccl::ProfTaskType::TASK_INTER_PROCESSOR_SYNC,
      28              :        hccl::ProfTaskType::TASK_REDUCE_INLINE,
      29              :        hccl::ProfTaskType::TASK_RDMA};
      30              : 
      31              : namespace {
      32           57 :     void ParseNotifySqeInfo(const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
      33              :     {
      34           57 :         msprofAicpuMC2HcclInfo.notifyID = sqeInfo.notifyId;
      35           57 :         msprofAicpuMC2HcclInfo.remoteRank = sqeInfo.remoteRank;
      36           57 :         msprofAicpuMC2HcclInfo.itemId = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_NOTIFY_RECORD)];
      37           57 :     };
      38              : 
      39           84 :     void ParseWaitqeInfo(const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
      40              :     {
      41           84 :         msprofAicpuMC2HcclInfo.notifyID = sqeInfo.notifyId;
      42           84 :         msprofAicpuMC2HcclInfo.remoteRank = sqeInfo.remoteRank;
      43           84 :         msprofAicpuMC2HcclInfo.role = static_cast<uint32_t>(hccl::TaskRole::DST);
      44           84 :         msprofAicpuMC2HcclInfo.itemId = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_NOTIFY_WAIT)];
      45           84 :     };
      46              : 
      47           16 :     void ParseSdmaSqeInfo(const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
      48              :     {
      49              :         // addrXHigh存的是地址的高32位
      50           16 :         msprofAicpuMC2HcclInfo.srcAddr = (static_cast<uint64_t>(sqeInfo.addr1High) << 32) | sqeInfo.addr1Low;
      51              :         // addrXLow存的是地址的低32位
      52           16 :         msprofAicpuMC2HcclInfo.dstAddr = (static_cast<uint64_t>(sqeInfo.addr2High) << 32) | sqeInfo.addr2Low;
      53           16 :         msprofAicpuMC2HcclInfo.remoteRank = sqeInfo.remoteRank;
      54           16 :         msprofAicpuMC2HcclInfo.role = static_cast<uint32_t>(hccl::TaskRole::DST);
      55           16 :         if (msprofAicpuMC2HcclInfo.localRank == msprofAicpuMC2HcclInfo.remoteRank) {
      56            2 :             msprofAicpuMC2HcclInfo.transportType = static_cast<uint32_t>(hccl::SimpleTaskType::LOCAL);
      57              :         } else {
      58           14 :             msprofAicpuMC2HcclInfo.transportType = static_cast<uint32_t>(hccl::SimpleTaskType::SDMA);
      59              :         }
      60           16 :         msprofAicpuMC2HcclInfo.linkType = sqeInfo.taskRelated.linkType;
      61           16 :         msprofAicpuMC2HcclInfo.dataSize = sqeInfo.length;
      62           16 :         if (sqeInfo.opCode == 0) { // 0表示不做随路规约
      63              :             // SDMA不展示数据类型
      64           16 :             msprofAicpuMC2HcclInfo.itemId = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_SDMA)];
      65              :         } else {
      66            0 :             TranslateOpcode(sqeInfo.opCode, msprofAicpuMC2HcclInfo.opType);
      67              :             msprofAicpuMC2HcclInfo.itemId
      68            0 :                 = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_REDUCE_INLINE)];
      69              :         }
      70           16 :     }
      71              : 
      72         2048 :     void ParseCommonSqeInfo([[maybe_unused]] const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
      73              :     {
      74         2048 :         HCCL_WARNING("Unsupported SQE type");
      75         2048 :         msprofAicpuMC2HcclInfo.itemId = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_HCCL_INFO)];
      76         2048 :     };
      77              : 
      78              :     // write value用于卡间的record
      79           28 :     void ParseWriteValueSqeInfo(const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
      80              :     {
      81           28 :         msprofAicpuMC2HcclInfo.remoteRank = sqeInfo.remoteRank;
      82           28 :         if (sqeInfo.subType == RT_STARS_WRITE_VALUE_SUB_TYPE_RDMA_DB_SEND) {
      83            0 :             msprofAicpuMC2HcclInfo.itemId = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_RDMA)];
      84            0 :             msprofAicpuMC2HcclInfo.linkType = static_cast<uint32_t>(hccl::LinkType::LINK_ROCE);       // reserved value
      85            0 :             msprofAicpuMC2HcclInfo.transportType = static_cast<uint32_t>(hccl::SimpleTaskType::RDMA); // reserved value
      86            0 :             msprofAicpuMC2HcclInfo.dataSize = sqeInfo.length;                                         // wr len
      87            0 :             msprofAicpuMC2HcclInfo.rdmaType = sqeInfo.taskRelated.rdmaType;
      88              :         } else {
      89              :             msprofAicpuMC2HcclInfo.itemId
      90           28 :                 = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_INTER_RANK_RECORD)];
      91              :         }
      92           28 :     };
      93              : 
      94            4 :     void ParseCondSqeInfo([[maybe_unused]] const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
      95              :     {
      96              :         msprofAicpuMC2HcclInfo.itemId
      97            4 :             = g_taskHashIds[static_cast<uint64_t>(hccl::ProfTaskType::TASK_INTER_PROCESSOR_SYNC)];
      98            4 :     };
      99              : } // namespace
     100              : 
     101         2237 : void ProfilingExtendInfoHelper::SqeInfo2MsprofAicpuMC2HcclInfo(
     102              :     const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
     103              : {
     104         2237 :     msprofAicpuMC2HcclInfo.taskId = sqeInfo.taskId;
     105         2237 :     msprofAicpuMC2HcclInfo.streamId = sqeInfo.streamId;
     106         2237 :     return ProfilingExtendInfoHelper::AssembleProfInfoByType(sqeInfo, msprofAicpuMC2HcclInfo);
     107              : }
     108              : 
     109         2237 : void ProfilingExtendInfoHelper::AssembleProfInfoByType(
     110              :     const SqeInfo& sqeInfo, MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
     111              : {
     112              :     static const std::unordered_map<uint8_t, Handle> funcMap
     113              :         = {{RT_STARS_SQE_TYPE_WRITE_VALUE, ParseWriteValueSqeInfo},
     114              :            {RT_STARS_SQE_TYPE_NOTIFY_RECORD, ParseNotifySqeInfo},
     115              :            {RT_STARS_SQE_TYPE_NOTIFY_WAIT, ParseWaitqeInfo},
     116              :            {RT_STARS_SQE_TYPE_SDMA, ParseSdmaSqeInfo},
     117         2241 :            {RT_STARS_SQE_TYPE_COND, ParseCondSqeInfo}};
     118         2237 :     auto it = funcMap.find(sqeInfo.type);
     119         2237 :     if (it == funcMap.cend()) {
     120         2048 :         return ParseCommonSqeInfo(sqeInfo, msprofAicpuMC2HcclInfo);
     121              :     }
     122          189 :     (it->second)(sqeInfo, msprofAicpuMC2HcclInfo);
     123              : }
     124              : 
     125         2237 : void ProfilingExtendInfoHelper::InitHcclInfo(MsprofAicpuHcclTaskInfo& msprofAicpuMC2HcclInfo)
     126              : {
     127         2237 :     msprofAicpuMC2HcclInfo.linkType = static_cast<uint8_t>(hccl::LinkType::LINK_RESERVED);
     128         2237 :     msprofAicpuMC2HcclInfo.rdmaType = static_cast<uint8_t>(hccl::RdmaType::RDMA_TYPE_RESERVED);
     129         2237 :     msprofAicpuMC2HcclInfo.dataType = static_cast<uint8_t>(HcclDataType::HCCL_DATA_TYPE_RESERVED);
     130         2237 :     msprofAicpuMC2HcclInfo.opType = static_cast<uint8_t>(HcclReduceOp::HCCL_REDUCE_RESERVED);
     131         2237 :     msprofAicpuMC2HcclInfo.workFlowMode = static_cast<uint8_t>(HcclWorkflowMode::HCCL_WORKFLOW_MODE_RESERVED);
     132         2237 :     msprofAicpuMC2HcclInfo.stage = 0;
     133         2237 :     msprofAicpuMC2HcclInfo.role = static_cast<uint8_t>(hccl::TaskRole::SRC);
     134         2237 :     msprofAicpuMC2HcclInfo.transportType = static_cast<uint8_t>(hccl::SimpleTaskType::LOCAL);
     135         2237 : }
     136              : 
     137           91 : void ProfilingExtendInfoHelper::InitProfItemId()
     138              : {
     139           91 :     if (MsprofReportBatchAdditionalInfo == nullptr) {
     140           91 :         if (AdprofGetHashId == nullptr) {
     141            0 :             HCCL_INFO("AdprofGetHashId is null, InitProfItemId just return");
     142            0 :             return;
     143              :         }
     144          819 :         for (const auto taskType : kfcTaskTypes) {
     145              :             // index保证是有效的
     146         1456 :             g_taskHashIds[static_cast<uint64_t>(taskType)] = AdprofGetHashId(
     147         2184 :                 hccl::GetProfTaskOpName(taskType).c_str(), hccl::GetProfTaskOpName(taskType).length());
     148              :         }
     149              :     } else {
     150            0 :         if (MsprofStr2Id == nullptr) {
     151            0 :             HCCL_INFO("MsprofStr2Id is null, InitProfItemId just return");
     152            0 :             return;
     153              :         }
     154            0 :         for (const auto taskType : kfcTaskTypes) {
     155              :             // index保证是有效的
     156            0 :             g_taskHashIds[static_cast<uint64_t>(taskType)]
     157            0 :                 = MsprofStr2Id(hccl::GetProfTaskOpName(taskType).c_str(), hccl::GetProfTaskOpName(taskType).length());
     158              :         }
     159              :     }
     160           91 :     return;
     161              : }
     162              : } // namespace dfx
        

Generated by: LCOV version 2.0-1