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