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