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 HCCL_CCU_CTX_H
12 : #define HCCL_CCU_CTX_H
13 :
14 : #include "ccu_device_manager.h"
15 : #include "ccu_ctx_signature.h"
16 : #include "ccu_ctx_arg.h"
17 : #include "ccu_task_arg.h"
18 : #include "ccu_res_pack_legacy.h"
19 : #include "ccu_task_param.h"
20 :
21 : #include "ccu_transport.h"
22 : #include "ccu_transport_group.h"
23 : #include "ccu_rep.h"
24 : #include "ccu_context_resource.h"
25 : #include "ccu_instr_info.h"
26 :
27 : #include "ccu_rep_context.h"
28 :
29 : namespace Hccl {
30 : constexpr uint32_t LOCAL_COPY_MS_PER_LOOP = 8;
31 : constexpr uint32_t CCU_MS_LOCAL_COPY_LOOP_COUNT = 8;
32 :
33 : class CcuContext : public CcuRep::CcuRepContext {
34 : public:
35 : explicit CcuContext(
36 : const CcuCtxArg& arg, const std::vector<CcuTransport*>& transports, const CcuTransportGroup& transportGroup);
37 21 : CcuContext() = default;
38 : ~CcuContext() override;
39 : HcclResult Init();
40 :
41 : CcuResReq GetResourceRequest();
42 : CcuRepResource& GetResource();
43 : CcuSharedResource& GetExportRes();
44 : CcuSharedResource& GetImportRes();
45 :
46 : void SetResPack(CcuResPack& resPack);
47 : CcuResPack* GetResPack() const;
48 : void SetInstrId(uint32_t instrId);
49 : uint32_t GetInstrId() const;
50 : uint32_t GetInstrCount();
51 : void SetCcuInstrInfo(const CcuRep::CcuInstrInfo& instrInfo);
52 :
53 : HcclResult GeneTaskParam(const CcuTaskArg& arg, std::vector<CcuTaskParam>& taskParams);
54 : // ccu profiling相关接口
55 : HcclResult GetCcuProfilingInfo(const CcuTaskArg& arg, std::vector<CcuProfilingInfo>& allCcuProfilingInfo);
56 :
57 0 : std::vector<CcuTransport*> GetCcuTransports() const { return transports; }
58 :
59 : protected:
60 : // 编程接口
61 : struct GroupOpConfig {
62 : uint32_t msInterleave;
63 : uint32_t loopCount;
64 : uint64_t memSlice;
65 : };
66 :
67 : struct GroupOpSizeResource {
68 : std::vector<CcuRep::MaskSignal> maskSignal;
69 : std::vector<CcuRep::CcuBuffer> ccuBuffer;
70 : std::vector<CcuRep::Executor> executor;
71 : };
72 :
73 : struct GroupOpSize {
74 : CcuRep::Variable addrOffset;
75 : CcuRep::Variable loopParam;
76 : CcuRep::Variable parallelParam;
77 : CcuRep::Variable residual;
78 : };
79 :
80 : // 使用Transport中的Variable
81 : CcuRep::Variable CreateVariable(const CcuTransport& transport, uint32_t varIndex) const;
82 : CcuRep::Variable CreateVariable();
83 : CcuRep::Variable CreateContinuousVariable();
84 : CcuRep::Address CreateAddress();
85 : CcuRep::Memory CreateMemory();
86 : CcuRep::Memory CreateMemory(const CcuRep::Variable& token);
87 : CcuRep::Memory GetRmtBuffer(const CcuTransport& transport, uint32_t index);
88 : CcuRep::MaskSignal CreateMaskSignal();
89 : CcuRep::CcuBuffer CreateCcuBuffer();
90 : CcuRep::Executor CreateExecutor();
91 : std::vector<CcuRep::CcuBuffer> CreateBlockCcuBuffer(uint32_t count);
92 : std::vector<CcuRep::Executor> CreateBlockExecutor(uint32_t count);
93 : std::vector<CcuRep::MaskSignal> CreateBlockMaskSignal(uint32_t count);
94 : GroupOpSize CreateGroupOpSize();
95 :
96 : // 不同Device不同Context间同步操作
97 : void LocalPost(const CcuRep::MaskSignal& sig, uint32_t mask = 1);
98 : void LocalWait(const CcuRep::MaskSignal& sig, uint32_t mask = 1);
99 : void RemotePost(const CcuTransport& transport, uint32_t signalIndex, uint32_t mask = 1, bool single = false);
100 : void WriteVariableWithSignal(
101 : const CcuTransport& transport, const CcuRep::Variable& var, uint32_t varIndex, uint32_t signalIndex,
102 : uint32_t mask = 1);
103 : void RemoteWait(const CcuTransport& transport, uint32_t signalIndex, uint32_t mask = 1);
104 : void GroupWait(const CcuTransportGroup& transportGroup, uint32_t signalIndex, uint32_t mask = 1);
105 : // 同一Device不同Context间同步操作
106 : void ExportVariable(const CcuRep::Variable& var, const std::string& tag);
107 : CcuRep::Variable ImportVariable(const std::string& tag);
108 : void ExportMaskSignal(const CcuRep::MaskSignal& sig, const std::string& tag);
109 : CcuRep::MaskSignal ImportMaskSignal(const std::string& tag);
110 :
111 : void LocalCtxPost(const CcuRep::MaskSignal& sig, uint32_t mask = 1);
112 : void LocalCtxPostVar(
113 : const CcuRep::Variable& srcVar, const CcuRep::Variable& dstVar, const CcuRep::MaskSignal& sig,
114 : uint32_t mask = 1);
115 : // 数据操作
116 : void Write(
117 : const CcuTransport& transport, const CcuRep::Memory& rem, const CcuRep::Memory& loc,
118 : const CcuRep::Variable& len, const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
119 : void Write(
120 : const CcuTransport& transport, const CcuRep::Memory& rem, const CcuRep::CcuBuffer& loc,
121 : const CcuRep::Variable& len, const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
122 : void Read(
123 : const CcuTransport& transport, const CcuRep::Memory& loc, const CcuRep::Memory& rem,
124 : const CcuRep::Variable& len, const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
125 : void Read(
126 : const CcuTransport& transport, const CcuRep::CcuBuffer& loc, const CcuRep::Memory& rem,
127 : const CcuRep::Variable& len, const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
128 : void WriteReduce(
129 : const CcuTransport& transport, const CcuRep::Memory& rem, const CcuRep::Memory& loc,
130 : const CcuRep::Variable& len, DataType dataType, ReduceOp opType, const CcuRep::MaskSignal& locSig,
131 : uint32_t mask = 1);
132 : void ReadReduce(
133 : const CcuTransport& transport, const CcuRep::Memory& loc, const CcuRep::Memory& rem,
134 : const CcuRep::Variable& len, DataType dataType, ReduceOp opType, const CcuRep::MaskSignal& locSig,
135 : uint32_t mask = 1);
136 : void LocalCopy(
137 : const CcuRep::Memory& dst, const CcuRep::Memory& src, const CcuRep::Variable& len,
138 : const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
139 : void LocalCopy(
140 : const CcuRep::CcuBuffer& dst, const CcuRep::Memory& src, const CcuRep::Variable& len,
141 : const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
142 : void LocalCopy(
143 : const CcuRep::Memory& dst, const CcuRep::CcuBuffer& src, const CcuRep::Variable& len,
144 : const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
145 : void LocalReduce(
146 : const CcuRep::Memory& dst, const CcuRep::Memory& src, const CcuRep::Variable& len, DataType dataType,
147 : ReduceOp opType, const CcuRep::MaskSignal& locSig, uint32_t mask = 1);
148 : void LocalReduce(
149 : const std::vector<CcuRep::CcuBuffer>& bufs, uint32_t count, DataType dataType, DataType outputDataType,
150 : ReduceOp opType, const CcuRep::MaskSignal& locSig, const CcuRep::Variable& len, uint32_t mask = 1);
151 : // 参数操作
152 : void Load(const CcuRep::Variable& var);
153 :
154 : // Variable src中存放内存地址,从地址中加载数据到Variable var中
155 : void LoadVariable(const CcuRep::Variable& src, const CcuRep::Variable& var, uint32_t num = 1);
156 : void LoadVariable(uint64_t addr, const CcuRep::Variable& var);
157 : void StoreVariable(const CcuRep::Variable& var, uint64_t addr);
158 : void LoadVariable(uint64_t addr, const CcuRep::Variable& var, uint32_t num);
159 : void StoreVariable(const CcuRep::Variable& var, const CcuRep::Variable& src);
160 : // 控制逻辑
161 : // 宏定义IF、WHILE
162 : CcuRep::FuncCall Func(const std::string& label);
163 : CcuRep::FuncCall Func(const CcuRep::Variable& funcAddr);
164 : CcuRep::LoopCall Loop(const std::string& label);
165 : void LoopGroup(
166 : const std::vector<CcuRep::LoopCall>& loops, const std::vector<CcuRep::Variable>& loopCfg,
167 : const CcuRep::Variable& paraCfg, const CcuRep::Variable& offsetCfg);
168 : // 高阶操作
169 : std::vector<uint64_t> CalGoSize(uint64_t size);
170 : static std::vector<uint64_t> CalGoSizeStatic(uint64_t size, GroupOpConfig& moCfg);
171 :
172 : void AllocGoResource(uint32_t parallelDim = CcuRep::CCU_MS_DEFAULT_LOOP_COUNT, uint32_t msPerLoop = 1);
173 : void Load(GroupOpSize moSize);
174 : void GroupBroadcast(
175 : const std::vector<CcuTransport*>& transports, std::vector<CcuRep::Memory> dst, CcuRep::Memory src,
176 : GroupOpSize goSize);
177 : void GroupReduce(
178 : const std::vector<CcuTransport*>& transports, CcuRep::Memory dst, std::vector<CcuRep::Memory> src,
179 : GroupOpSize goSize, DataType dataType, DataType outputDataType, ReduceOp opType);
180 : void GroupCopy(CcuRep::Memory dst, CcuRep::Memory src, GroupOpSize goSize);
181 : void GroupBroadcastWithoutMyRank(
182 : const std::vector<CcuTransport*>& ccuTransports, std::vector<CcuRep::Memory> dst, CcuRep::Memory src,
183 : GroupOpSize goSize);
184 : void GroupReduceWithoutMyRank(
185 : const std::vector<CcuTransport*>& ccuTransports, CcuRep::Memory& dst, std::vector<CcuRep::Memory>& src,
186 : GroupOpSize& goSize, DataType dataType, DataType outputDataType, ReduceOp opType);
187 : // 子类实现
188 : virtual void Algorithm() = 0;
189 : virtual std::vector<uint64_t> GeneArgs(const CcuTaskArg& arg) = 0;
190 :
191 : private:
192 : void CreateMultiOpCopy();
193 : void CreateMultiOpBroadcast(const std::vector<CcuTransport*>& transports);
194 : void CreateMultiOpReduce(
195 : const std::vector<CcuTransport*>& transports, DataType dataType, DataType outputDataType, ReduceOp opType);
196 : void CreateMultiOpBroadcastWithoutMyRank(const std::vector<CcuTransport*>& ccuTransports);
197 :
198 : void CreateMultiOpReduceWithoutMyRank(
199 : const std::vector<CcuTransport*>& ccuTransports, DataType dataType, DataType outputDataType, ReduceOp opType);
200 : template <typename T>
201 : T CreateResAssist(std::array<std::vector<T>, MAX_CCU_IODIE_NUM>& resRecord);
202 : template <typename T>
203 : std::vector<T> CreateBlockResAssist(uint32_t count, std::array<std::vector<T>, MAX_CCU_IODIE_NUM>& resRecord);
204 :
205 : // CCU Profiling
206 : uint64_t GetArgIndex(
207 : const std::unordered_map<uint16_t, uint16_t>& varId2VarIdMap,
208 : const std::unordered_map<uint16_t, uint32_t>& varId2ArgIndexMap, const std::vector<uint64_t>& taskArgs,
209 : uint16_t varId) const;
210 : void AddCcuProfiling(GroupOpSize goSize, const std::vector<CcuTransport*>& transportsIn);
211 : void AddCcuProfiling(
212 : GroupOpSize goSize, const std::vector<CcuTransport*>& transportsIn, DataType dataType, DataType outputDataType,
213 : ReduceOp opType);
214 : void DumpCcuProfilingInfo(const std::vector<CcuProfilingInfo>& ccuProfilingInfo) const;
215 : // 该友元函数用于在context类外创建Variable并被context内的资源管理器管理
216 : friend HcclResult CcuRep::CreateVariable(CcuRep::CcuRepContext* context, CcuRep::Variable& variable);
217 :
218 : protected:
219 : std::vector<CcuTransport*> transports;
220 : const CcuTransportGroup* transportGroup{nullptr};
221 :
222 : GroupOpConfig moConfig{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF};
223 : GroupOpSizeResource moRes;
224 :
225 : private:
226 : CcuSharedResource exportRes;
227 : CcuSharedResource importRes;
228 : CcuRepResource res;
229 : CcuResPack* resPack_{nullptr}; // 资源生命周期目前由框架层维护,通信域销毁时销毁该资源
230 :
231 : CcuRep::CcuInstrInfo instrInfo;
232 :
233 : uint32_t loadArgIndex{0};
234 : // ccu profiling相关缓存
235 : std::vector<GroupOpSize> groupOpSizeInfo;
236 : };
237 :
238 : }; // namespace Hccl
239 :
240 : #endif // HCCL_CCU_CTX_H
|