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