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