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
|