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 RES_PUB_H
12 : #define RES_PUB_H
13 : #include <vector>
14 : #include <functional>
15 : #include "hccl/hccl_types.h"
16 : #include "hccl/base.h"
17 : constexpr u32 INVALID_U32 = UINT32_MAX;
18 : constexpr u64 DFX_INVALID_U64 = UINT64_MAX;
19 : constexpr s32 INVALID_RANKID = INT32_MAX;
20 :
21 : // 以下枚举来源于 legacy/ascend950,以 enum : uint8_t 形式独立定义,
22 : // 使 res_pub.h 脱离 legacy 头文件依赖。值与 MAKE_ENUM 原定义一致。
23 : namespace Hccl {
24 :
25 : enum OpTypeVal : u8 {
26 : OP_TYPE_ALLREDUCE = 0,
27 : OP_TYPE_BROADCAST = 1,
28 : OP_TYPE_ALLGATHER = 2,
29 : OP_TYPE_REDUCESCATTER = 3,
30 : OP_TYPE_SEND = 4,
31 : OP_TYPE_RECV = 5,
32 : OP_TYPE_BARRIER = 6,
33 : OP_TYPE_ALLTOALL = 7,
34 : OP_TYPE_REDUCE = 8,
35 : OP_TYPE_GATHER = 9,
36 : OP_TYPE_SCATTER = 10,
37 : OP_TYPE_ALLTOALLV = 11,
38 : OP_TYPE_ALLTOALLVC = 12,
39 : OP_TYPE_HALFALLTOALLV = 13,
40 : OP_TYPE_BATCHSENDRECV = 14,
41 : OP_TYPE_BATCHGET = 15,
42 : OP_TYPE_BATCHPUT = 16,
43 : OP_TYPE_ALLGATHERV = 17,
44 : OP_TYPE_REDUCESCATTERV = 18,
45 : OP_TYPE_DEBUGCASE = 19,
46 : OP_TYPE_INVALID = 20,
47 : OP_TYPE_COUNT
48 : };
49 :
50 : enum AlgTypeVal : u8 {
51 : ALG_TYPE_NOT_SPECIFIED = 0,
52 : ALG_TYPE_RING = 1,
53 : ALG_TYPE_MULTI_RING = 2,
54 : ALG_TYPE_MESH = 3,
55 : ALG_TYPE_RECURSIVE_HD = 4,
56 : ALG_TYPE_BINARY_HD = 5,
57 : ALG_TYPE_PAIR_WISE = 6,
58 : ALG_TYPE_INVALID_VAL = 7,
59 : ALG_TYPE_COUNT
60 : };
61 :
62 : enum TaskParamTypeVal : u8 {
63 : TASK_SDMA = 0,
64 : TASK_RDMA = 1,
65 : TASK_REDUCE_INLINE = 2,
66 : TASK_REDUCE_TBE = 3,
67 : TASK_NOTIFY_RECORD = 4,
68 : TASK_NOTIFY_WAIT = 5,
69 : TASK_SEND_NOTIFY = 6,
70 : TASK_SEND_PAYLOAD = 7,
71 : TASK_WRITE_WITH_NOTIFY = 8,
72 : TASK_WRITE_REDUCE_WITH_NOTIFY = 9,
73 : TASK_CCU = 10,
74 : TASK_AICPU_KERNEL = 11,
75 : TASK_AICPU_REDUCE = 12,
76 : TASK_AIV = 13,
77 : TASK_UB_INLINE_WRITE = 14,
78 : TASK_UB_REDUCE_INLINE = 15,
79 : TASK_UB = 16,
80 : TASK_DPU_KERNEL = 17,
81 : TASK_DPU_THREAD_FENCE = 18,
82 : TASK_DPU_CHANNEL_FENCE = 19,
83 : TASK_DPU_INLINE_WRITE = 20,
84 : TASK_DPU_NOTIFY_WAIT = 21,
85 : TASK_DPU_WRITE_WITH_NOTIFY = 22,
86 : TASK_PARAM_TYPE_COUNT
87 : };
88 :
89 : enum DfxLinkTypeVal : u8 {
90 : LINK_ONCHIP = 0,
91 : LINK_HCCS = 1,
92 : LINK_PCIE = 2,
93 : LINK_ROCE = 3,
94 : LINK_SIO = 4,
95 : LINK_HCCS_SW = 5,
96 : LINK_STANDARD_ROCE = 6,
97 : LINK_UB = 7,
98 : LINK_UBoE = 8,
99 : LINK_RESERVED = 9,
100 : LINK_TYPE_COUNT
101 : };
102 :
103 : enum DfxWorkflowMode : u8 {
104 : NEW_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB = 0,
105 : NEW_WORKFLOW_MODE_OP_BASE = 1,
106 : NEW_WORKFLOW_MODE_RESERVED = 2
107 : };
108 :
109 : enum DfxTransportType : u8 {
110 : DFX_TRANSPORT_TYPE_SDMA = 0,
111 : DFX_TRANSPORT_TYPE_RDMA = 1,
112 : DFX_TRANSPORT_TYPE_LOCAL = 2,
113 : DFX_TRANSPORT_TYPE_UB = 3,
114 : DFX_TRANSPORT_TYPE_ROCE = 4
115 : };
116 :
117 : constexpr u32 DFX_INVALID_RANKID = 0xFFFFFFFF;
118 :
119 : enum DfxTaskRole : u8 { NEW_TASK_ROLE_DST = 0, NEW_TASK_ROLE_SRC = 1 };
120 :
121 : } // namespace Hccl
122 :
123 : namespace Hccl {
124 :
125 : // DFX 环形队列容量
126 : constexpr u32 DFX_TASK_INFO_QUEUE_CAPACITY = 2048 + 128; // 2048 基础容量 + 128 余量
127 : constexpr u32 DFX_OP_INFO_QUEUE_CAPACITY = 1024;
128 :
129 : struct DfxDfxOpInfo {
130 : // 8B 对齐字段(7 × 8B = 56B)
131 : void* commHandle{
132 : nullptr}; // 通信域句柄,来源于 dfxOpInfo_->comm_,用于从 CollCommAicpu 获取上下文
133 : // groupName/localRank/rankSize 不存入 DfxDfxOpInfo:属于通信域级别(同一通信域内所有算子相同),
134 : // 由 HcclCommDfxLite 存储并传递给 DfxProfilingHandlerLite 缓存使用
135 : // cclTag 不单独存储:与 opType 一一对应(均来自 CMD_OP_TYPE_INFO_MAP),
136 : // 上报 Msprof 时通过 opTypeHashCache_[opType] 查表转为 GetProfHashId 哈希值
137 : u64 count{0}; // 发送数据个数,来源于 dfxOpInfo_->op_.dataCount
138 : u64 srcAddr{0}; // 算子级输入地址,来源于 dfxOpInfo_->op_.newInputMem
139 : u64 dstAddr{0}; // 算子级输出地址,来源于 dfxOpInfo_->op_.newOutputMem
140 : u64 srcSize{0}; // 算子级输入大小,来源于 dfxOpInfo_->op_.inputMemSize
141 : u64 dstSize{0}; // 算子级输出大小,来源于 dfxOpInfo_->op_.outputMemSize
142 : void* hcclCommDfxLite{
143 : nullptr}; // HcclCommDfxLite 指针(void* 避免 base_comm 对 coll_communicator_mgr 的编译期依赖)
144 : // 上报时 static_cast<HcclCommDfxLite*>(hcclCommDfxLite)->GetChannelRemoteRankId(channelHandle)
145 :
146 : // 4B 对齐字段(3 × 4B = 12B,offset 56)
147 : u32 opIndex{0}; // 算子序号,标识当前是 algTag 数组的第几个,来源于 dfxOpInfo_->opIndex_
148 : u32 cpuWaitAicpuNotifyId{0}; // Host 等 Device 的 notify ID,来源于 dfxOpInfo_->cpuWaitAicpuNotifyId_
149 : u32 aicpuWaitCpuNotifyId{0}; // Device 等 Host 的 notify ID,来源于 DfxOpInfo
150 :
151 : // 1B 对齐字段(3 × 1B = 3B,offset 68)
152 : u8 opType{0}; // 算子类型枚举值,来源于 dfxOpInfo_->op_.opType(OpType 底层 uint8_t)
153 : u8 algType{0}; // 通信算法枚举值,来源于 AlgType 底层 uint8_t(如 RING/MESH 等;当前 Lite 路径固定为 NHR)
154 : // 上报 Msprof 时通过 algTypeHashCache_[algType] 查表转为 GetProfHashId 哈希值
155 : u8 dataType{
156 : 0}; // 数据类型枚举值,来源于 dfxOpInfo_->op_.dataType(HcclDataType 底层 uint8_t)
157 : // 由 SetCurrDfxOpInfo 从 oldDataType 转换后获取;从 task 级提升为算子级,每个算子只有一个 dataType
158 :
159 : // 变长尾部字段(offset 71,无需对齐填充)
160 : char algTag[288]{0}; // 算子标签字符串,来源于 dfxOpInfo_->algTag_,288 = TAG_MAX_LENGTH(256) + 32 余量
161 : // 71+288=359,尾部填充 1B 对齐到 360B
162 : };
163 :
164 : struct DfxTaskParaNotify { // Notify 任务参数(NOTIFY_RECORD/NOTIFY_WAIT)
165 : u64 sqeAddr; // SQE 中的偏移地址
166 : };
167 :
168 : struct DfxTaskParaDma { // SDMA 任务参数,信息从 SQE 获取
169 : u64 sqeAddr; // SQE 中的偏移地址
170 : };
171 :
172 : struct DfxTaskParaUbDma { // UB DMA 任务参数
173 : u64 sqeAddr; // SQE 中的偏移地址
174 : u64 srcAddr; // 源地址
175 : u64 dstAddr; // 目的地址
176 : u64 size; // 数据大小(字节)
177 : u32 notifyId{INVALID_U32}; // Notify ID,来源于 ParaDMA::notifyID,taskException 使用
178 : // write with notify SQE 中无此字段;cnt notify 不支持跨片
179 : };
180 :
181 : struct DfxTaskParaReduce { // UB Reduce 任务参数
182 : u64 sqeAddr; // SQE 中的偏移地址
183 : u64 srcAddr; // 源地址
184 : u64 dstAddr; // 目的地址
185 : u64 size; // 数据大小(字节)
186 : u32 notifyId{INVALID_U32}; // Notify ID,来源于 ParaReduce::notifyID,taskException 使用
187 : u8 reduceOp; // Reduce 操作类型枚举值(HcclReduceOp 底层 uint8_t,仅 Reduce 类 task 有效)
188 : };
189 :
190 : struct DfxTaskParaWriteValue { // P2P WriteValue 任务参数
191 : u64 sqeAddr; // SQE 中的偏移地址
192 : u32 notifyId{INVALID_U32}; // Notify ID,来源于 ParaReduce::notifyID,taskException 使用
193 : };
194 :
195 : struct DfxTaskInfo {
196 : // 8B 对齐字段
197 : u64 dfxOpInfo{DFX_INVALID_U64}; // 算子级上下文指针,指向 AicpuTsThread 缓存的 DfxDfxOpInfo
198 : u64 channelHandle{DFX_INVALID_U64}; // Channel 句柄,来源于 TaskInfo::channelHandle_
199 : // 获取 remoteRankId;taskException 通过 dfxOpInfo->commHandle 定位通信域
200 : // (与 DfxTaskInfo::hcclCommDfxLite 职责不重叠)
201 : // 任务参数(按 taskType 使用其中一个分支,与 TaskParam::taskPara 的 union 模式一致)
202 : union {
203 : DfxTaskParaNotify Notify; // NOTIFY_RECORD/NOTIFY_WAIT 使用
204 : DfxTaskParaDma Dma; // SDMA 使用
205 : DfxTaskParaUbDma ubDma;
206 : DfxTaskParaReduce Reduce; // REDUCE 使用
207 : DfxTaskParaWriteValue writeValue;
208 : } taskPara;
209 :
210 : // 4B 对齐字段
211 : u32 sqId; // Stream Queue ID
212 : u32 taskId; // Stream Queue Entry ID
213 :
214 : // 1B 对齐字段
215 : u8 taskType; // 任务类型枚举值(TaskParamType 底层 uint8_t)
216 : u8 linkType; // 链路类型枚举值(DfxLinkType 底层 uint8_t)
217 : u8 transportType; // 传输类型:0=SDMA, 1=RDMA, 2=LOCAL(由 remoteRank 推导),还有 UB Transport 写入的 UB
218 : // 尾部填充 1B 对齐到 64B
219 :
220 22 : bool IsTaskTypeValid() const { return taskType < static_cast<u8>(TaskParamTypeVal::TASK_PARAM_TYPE_COUNT); }
221 : };
222 : } // namespace Hccl
223 : #endif // RES_PUB_H
|