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_PARAM_H
12 : #define TASK_PARAM_H
13 :
14 : #include <vector>
15 : #include <string>
16 : #include <memory>
17 : #include "securec.h"
18 : #include "hccl/base.h"
19 : #include "const_val.h"
20 : #include "enum_factory.h"
21 : #include "string_util.h"
22 : #include "ip_address.h"
23 : #include "op_type.h"
24 :
25 : namespace Hccl {
26 :
27 73 : MAKE_ENUM(DmaOp, HCCL_DMA_READ, HCCL_DMA_WRITE, HCCL_DMA_NOTIFY_WAIT)
28 :
29 54 : MAKE_ENUM(AlgType, NOT_SPECIFIED, RING, MULTI_RING, MESH, RECURSIVE_HD, BINARY_HD, PAIR_WISE, INVALID_VAL)
30 :
31 488939 : MAKE_ENUM(
32 : TaskParamType, TASK_SDMA, TASK_RDMA, TASK_REDUCE_INLINE, TASK_REDUCE_TBE, TASK_NOTIFY_RECORD, TASK_NOTIFY_WAIT,
33 : TASK_SEND_NOTIFY, TASK_SEND_PAYLOAD, TASK_WRITE_WITH_NOTIFY, TASK_WRITE_REDUCE_WITH_NOTIFY, TASK_CCU,
34 : TASK_AICPU_KERNEL, TASK_AICPU_REDUCE, TASK_AIV, TASK_UB_INLINE_WRITE, TASK_UB_REDUCE_INLINE, TASK_UB,
35 : TASK_DPU_KERNEL, TASK_DPU_THREAD_FENCE, TASK_DPU_CHANNEL_FENCE, TASK_DPU_INLINE_WRITE, TASK_DPU_NOTIFY_WAIT,
36 : TASK_DPU_WRITE_WITH_NOTIFY)
37 :
38 96 : MAKE_ENUM(DfxLinkType, ONCHIP, HCCS, PCIE, ROCE, SIO, HCCS_SW, STANDARD_ROCE, UB, UBoE, RESERVED)
39 :
40 : MAKE_ENUM(CcuProfilinType, CCU_TASK_PROFILING, CCU_WAITCKE_PROFILING, CCU_LOOPGROUP_PROFILING, CCU_MAP_PROFILING)
41 :
42 : constexpr uint16_t CCU_MAX_CHANNEL_NUM = 16; // 最多16条link
43 : constexpr uint16_t INVALID_CKE_ID = 0xFFFF; // CKE ID非法值
44 : constexpr uint16_t INVALID_VALUE_CHANNELID = 0xFFFF; // channel id非法值
45 : constexpr u64 INVALID_VALUE_NOTIFYID = 0xFFFFFFFFFFFFFFFF; // NOTIFY id非法值
46 : constexpr u32 INVALID_VALUE_RANKID = 0xFFFFFFFF; // rank id非法值
47 : struct CcuProfilingInfo {
48 : std::string name; // CCU任务名或微码名
49 : uint8_t type; // 枚举,0为Task粒度,1为WaitCKE,2为LoopGroup,3为channelId->RemoteRankId的映射
50 : uint8_t dieId; // CCU任务执行的DieId
51 : uint8_t missionId; // CCU任务执行的MissionId
52 : uint16_t instrId;
53 : uint8_t reduceOpType; // 与HcclReduceOp类型保持一致
54 : uint8_t inputDataType; // 与HcclDataType类型保持一致
55 : uint8_t outputDataType; // 与HcclDataType类型保持一致
56 : uint64_t dataSize; // 输入数据大小
57 : uint32_t ckeId;
58 : uint32_t mask;
59 : uint16_t channelId[CCU_MAX_CHANNEL_NUM]; // LoopGroup所包含的搬运指令使用的ChannelId
60 : uint32_t remoteRankId[CCU_MAX_CHANNEL_NUM]; // LoopGroup所包含的搬运指令的对端
61 : uint64_t channelHandle[CCU_MAX_CHANNEL_NUM]; // channelhandle句柄
62 :
63 318 : CcuProfilingInfo()
64 636 : : name(""),
65 318 : type(0),
66 318 : dieId(0),
67 318 : missionId(0),
68 318 : instrId(0),
69 318 : reduceOpType(0),
70 318 : inputDataType(0),
71 318 : outputDataType(0),
72 318 : dataSize(0),
73 318 : ckeId(0),
74 318 : mask(0)
75 : {
76 318 : (void)memset_s(channelId, sizeof(channelId), INVALID_VALUE_CHANNELID, sizeof(channelId));
77 5406 : for (u32 i = 0; i < CCU_MAX_CHANNEL_NUM; i++) {
78 5088 : remoteRankId[i] = INVALID_VALUE_RANKID;
79 : }
80 5406 : for (u32 i = 0; i < CCU_MAX_CHANNEL_NUM; i++) {
81 5088 : channelHandle[i] = INVALID_VALUE_NOTIFYID;
82 : }
83 318 : }
84 : };
85 : constexpr u32 ADD_LEN = 128;
86 : struct ParaDMA {
87 : const void* src;
88 : const void* dst;
89 : std::size_t size;
90 : u64 notifyID;
91 : u32 notifyValue;
92 : DfxLinkType linkType;
93 : DmaOp dmaOp;
94 : Eid locEid{};
95 : Eid rmtEid{};
96 : char locAddr[ADD_LEN]{};
97 : char rmtAddr[ADD_LEN]{};
98 : };
99 :
100 : struct ParaReduce {
101 : const void* src;
102 : const void* dst;
103 : std::size_t size;
104 : u64 notifyID;
105 : u32 notifyValue;
106 : DfxLinkType linkType;
107 : HcclReduceOp reduceOp{HcclReduceOp::HCCL_REDUCE_RESERVED};
108 : HcclDataType dataType{HcclDataType::HCCL_DATA_TYPE_RESERVED};
109 : Eid locEid{};
110 : Eid rmtEid{};
111 : };
112 :
113 : struct ParaNotify {
114 : u64 notifyID;
115 : u32 value;
116 : };
117 :
118 : struct ParaCcu {
119 : u8 dieId;
120 : u8 missionId;
121 : u8 execMissionId;
122 : u32 instrId;
123 : u64 executeId;
124 : u64 ccuKernelHandle{0};
125 : };
126 :
127 : struct ParaAiv {
128 : HcclCMDType cmdType;
129 : u32 tag;
130 : u64 count;
131 : u32 numBlocks;
132 : u32 rankSize;
133 : void* flagMem;
134 : u64 flagMemSize;
135 : u32 rank;
136 : u32 sendRecvRemoteRank;
137 : HcclDataType dataType;
138 : };
139 :
140 : struct TaskParam {
141 : TaskParamType taskType;
142 : u64 beginTime;
143 : u64 endTime;
144 : u64 aicpuTaskId{0};
145 : uint16_t npuDevId{0};
146 : bool isMaster{false};
147 : union {
148 : ParaDMA DMA; // taskType = SDMA/RDMA使用, 包括rtRDMASend写notify
149 : ParaReduce Reduce; // taskType = inline/CCE Reduce使用
150 : ParaNotify Notify; // taskType = Noitfy Record/Wait使用
151 : ParaCcu Ccu;
152 : ParaAiv Aiv; // aiv param
153 : } taskPara;
154 : std::shared_ptr<std::vector<CcuProfilingInfo>> ccuDetailInfo; // taskType为TASK_CCU时,ParaCcu的补充profiling信息
155 24 : std::string Describe() const
156 : {
157 48 : return StringFormat(
158 : "TaskParam[taskType[%s] beginTime[%llu] endTime[%llu] aicpuTaskId[%llu]",
159 48 : taskType.Describe().c_str(), beginTime, endTime, aicpuTaskId)
160 72 : + DescribeDetail(*this) + "]";
161 : }
162 :
163 : private:
164 24 : static std::string DescribeDetail(const TaskParam& param)
165 : {
166 24 : std::string result;
167 24 : switch (param.taskType) {
168 2 : case TaskParamType::TASK_SDMA:
169 : case TaskParamType::TASK_RDMA:
170 : case TaskParamType::TASK_SEND_PAYLOAD:
171 : case TaskParamType::TASK_UB_INLINE_WRITE:
172 : case TaskParamType::TASK_UB:
173 : case TaskParamType::TASK_WRITE_WITH_NOTIFY:
174 : case TaskParamType::TASK_WRITE_REDUCE_WITH_NOTIFY:
175 : case TaskParamType::TASK_DPU_INLINE_WRITE:
176 : case TaskParamType::TASK_DPU_WRITE_WITH_NOTIFY:
177 6 : result += StringFormat(
178 2 : " src[%p] dst[%p] size[%zu] notifyID[%llu] dmaOp[%s] linkType[%s]", param.taskPara.DMA.src,
179 2 : param.taskPara.DMA.dst, param.taskPara.DMA.size, param.taskPara.DMA.notifyID,
180 8 : param.taskPara.DMA.dmaOp.Describe().c_str(), param.taskPara.DMA.linkType.Describe().c_str());
181 2 : break;
182 2 : case TaskParamType::TASK_REDUCE_INLINE:
183 : case TaskParamType::TASK_UB_REDUCE_INLINE:
184 : case TaskParamType::TASK_REDUCE_TBE:
185 4 : result += StringFormat(
186 : " src[%p] dst[%p] size[%zu] notifyID[%llu] reduceOp[%d] dataType[%d] linkType[%s]",
187 2 : param.taskPara.Reduce.src, param.taskPara.Reduce.dst, param.taskPara.Reduce.size,
188 2 : param.taskPara.Reduce.notifyID, static_cast<int>(param.taskPara.Reduce.reduceOp),
189 2 : static_cast<int>(param.taskPara.Reduce.dataType),
190 6 : param.taskPara.Reduce.linkType.Describe().c_str());
191 2 : break;
192 13 : case TaskParamType::TASK_NOTIFY_RECORD:
193 : case TaskParamType::TASK_NOTIFY_WAIT:
194 : case TaskParamType::TASK_SEND_NOTIFY:
195 : case TaskParamType::TASK_DPU_NOTIFY_WAIT:
196 : case TaskParamType::TASK_DPU_CHANNEL_FENCE:
197 13 : result += StringFormat(
198 13 : " notifyID[%llu] value[%u]", param.taskPara.Notify.notifyID, param.taskPara.Notify.value);
199 13 : break;
200 0 : case TaskParamType::TASK_AIV:
201 0 : result += StringFormat(
202 : " cmdType[%d] tag[%u] count[%llu] numBlocks[%u] rankSize[%u]"
203 : " rank[%u] remoteRank[%u] dataType[%d]",
204 0 : static_cast<int>(param.taskPara.Aiv.cmdType), param.taskPara.Aiv.tag, param.taskPara.Aiv.count,
205 0 : param.taskPara.Aiv.numBlocks, param.taskPara.Aiv.rankSize, param.taskPara.Aiv.rank,
206 0 : param.taskPara.Aiv.sendRecvRemoteRank, static_cast<int>(param.taskPara.Aiv.dataType));
207 0 : break;
208 0 : case TaskParamType::TASK_CCU:
209 0 : result += StringFormat(
210 0 : " dieId[%u] missionId[%u] execMissionId[%u] instrId[%u] executeId[%llu]", param.taskPara.Ccu.dieId,
211 0 : param.taskPara.Ccu.missionId, param.taskPara.Ccu.execMissionId, param.taskPara.Ccu.instrId,
212 0 : param.taskPara.Ccu.executeId);
213 0 : break;
214 7 : default:
215 7 : break;
216 : }
217 24 : return result;
218 0 : }
219 : };
220 :
221 : const std::map<HcclCMDType, std::pair<Hccl::OpType, std::string>> CMD_OP_TYPE_INFO_MAP = {
222 : {HcclCMDType::HCCL_CMD_ALLREDUCE, {Hccl::OpType::ALLREDUCE, "OpType::ALLREDUCE"}},
223 : {HcclCMDType::HCCL_CMD_ALLGATHER, {Hccl::OpType::ALLGATHER, "OpType::ALLGATHER"}},
224 : {HcclCMDType::HCCL_CMD_REDUCE_SCATTER, {Hccl::OpType::REDUCESCATTER, "OpType::REDUCESCATTER"}},
225 : {HcclCMDType::HCCL_CMD_SEND, {Hccl::OpType::SEND, "OpType::SEND"}},
226 : {HcclCMDType::HCCL_CMD_RECEIVE, {Hccl::OpType::RECV, "OpType::RECV"}},
227 : {HcclCMDType::HCCL_CMD_ALLTOALL, {Hccl::OpType::ALLTOALL, "OpType::ALLTOALL"}},
228 : {HcclCMDType::HCCL_CMD_ALLTOALLV, {Hccl::OpType::ALLTOALLV, "OpType::ALLTOALLV"}},
229 : {HcclCMDType::HCCL_CMD_BROADCAST, {Hccl::OpType::BROADCAST, "OpType::BROADCAST"}},
230 : {HcclCMDType::HCCL_CMD_ALLGATHER_V, {Hccl::OpType::ALLGATHERV, "OpType::ALLGATHERV"}},
231 : {HcclCMDType::HCCL_CMD_REDUCE_SCATTER_V, {Hccl::OpType::REDUCESCATTERV, "OpType::REDUCESCATTERV"}},
232 : {HcclCMDType::HCCL_CMD_REDUCE, {Hccl::OpType::REDUCE, "OpType::REDUCE"}},
233 : {HcclCMDType::HCCL_CMD_ALLTOALLVC, {Hccl::OpType::ALLTOALLVC, "OpType::ALLTOALLVC"}},
234 : {HcclCMDType::HCCL_CMD_SCATTER, {Hccl::OpType::SCATTER, "OpType::SCATTER"}},
235 : {HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, {Hccl::OpType::BATCHSENDRECV, "OpType::BATCHSENDRECV"}},
236 : {HcclCMDType::HCCL_CMD_HALF_ALLTOALLV, {Hccl::OpType::HALFALLTOALLV, "OpType::HALFALLTOALLV"}},
237 : {HcclCMDType::HCCL_CMD_BARRIER, {Hccl::OpType::BARRIER, "OpType::BARRIER"}},
238 : {HcclCMDType::HCCL_CMD_GATHER, {Hccl::OpType::GATHER, "OpType::GATHER"}},
239 : {HcclCMDType::HCCL_CMD_BATCH_GET, {Hccl::OpType::BATCHGET, "OpType::BATCHGET"}},
240 : {HcclCMDType::HCCL_CMD_BATCH_PUT, {Hccl::OpType::BATCHPUT, "OpType::BATCHPUT"}},
241 : };
242 :
243 : } // namespace Hccl
244 :
245 : #endif
|