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_MGR_IMP_H
12 : #define HCCL_CCU_CTX_MGR_IMP_H
13 :
14 : #include "ccu_ctx_mgr.h"
15 :
16 : #include <mutex>
17 : #include <unordered_map>
18 : #include "ccu_device_manager.h"
19 : #include "ccu_rep_translator.h"
20 :
21 : namespace Hccl {
22 :
23 : using namespace CcuRep;
24 :
25 : class CtxMgrImp {
26 : public:
27 : ~CtxMgrImp();
28 :
29 : CtxMgrImp(const CtxMgrImp& that) = delete;
30 :
31 : CtxMgrImp& operator=(const CtxMgrImp& that) = delete;
32 :
33 : /**
34 : * @brief 获取CtxMgrImp的实例
35 : * @param deviceLogicId 设备逻辑ID
36 : * @return 返回对应deviceLogicId的CtxMgrImp实例
37 : */
38 : static CtxMgrImp& GetInstance(s32 deviceLogicId);
39 :
40 : /**
41 : * @brief 初始化CtxMgrImp的实例
42 : * @param deviceLogicId 设备逻辑ID
43 : * @return void
44 : */
45 : void Init();
46 :
47 : /**
48 : * @brief 解初始化CtxMgrImp的实例
49 : * @param deviceLogicId 设备逻辑ID
50 : * @return void
51 : */
52 : void Deinit();
53 :
54 : /**
55 : * @brief 分配资源
56 : * @param ctxGroup ccuContext上下文组
57 : * @param resPack 资源包
58 : * @return 分配资源的结果
59 : */
60 : HcclResult AllocRes(CcuCtxGroup& ctxGroup, CcuResPack& resPack);
61 :
62 : /**
63 : * @brief 释放资源
64 : * @param ctxGroup 资源句柄
65 : * @return HcclResult 返回释放资源的结果
66 : * @note 释放由CcuCtxGroup handle指定的资源
67 : */
68 : HcclResult ReleaseRes(CcuCtxGroup& ctxGroup) const;
69 :
70 : /**
71 : * @brief 注册CcuCtxGroup
72 : * @param ctxGroup 要注册的CCU上下文组
73 : * @return 返回一个64位无符号整型值,注册成功的标识的ctxGroup映射的id
74 : */
75 : uint64_t Register(CcuCtxGroup& ctxGroup, bool isFuncBlock = false);
76 :
77 : /**
78 : * @brief 注销执行器
79 : *
80 : * @param executorId 执行器ID
81 : * @return HcclResult 注销结果
82 : * @note 此函数用于注销指定ID的执行器
83 : */
84 : HcclResult UnRegister(const uint64_t executorId);
85 :
86 : /**
87 : * 获取任务参数
88 : * @param executorId 任务ID
89 : * @param args CCU参数
90 : * @return 返回任务参数:对外层vector对应多个ctx(mission), 内存vector对应一个ctx下的多个任务参数
91 : */
92 : std::vector<std::vector<CcuTaskParam>> GetTaskParam(CcuTaskArg& ccuTaskArg, const uint64_t executorId);
93 :
94 : /**
95 : * 获取任务Profiling信息
96 : * @param entityId 任务ID
97 : * @return 返回任务Profiling信息:对外层vector对应多个ctx(mission), 内层vector对应一个ctx下的多个任务Profiling信息
98 : */
99 : std::vector<std::vector<CcuProfilingInfo>> GetProfilingInfo(CcuTaskArg& ccuTaskArg, const uint64_t entityId);
100 :
101 : /**
102 : * 获取CcuContext
103 : * @param executorId 任务ID
104 : * @param dieId Die ID
105 : * @param missionId Mission ID
106 : * @return 返回匹配的CcuContext, 未找到则返回nullptr
107 : */
108 : CcuContext* GetCtx(uint64_t executorId, uint32_t dieId, uint32_t missionId);
109 :
110 : private:
111 : explicit CtxMgrImp();
112 :
113 : void CtxInit(CcuCtxGroup& ctxGroup) const;
114 :
115 : HcclResult AllocInstrRes(CcuCtxGroup& ctxGroup) const;
116 : HcclResult ReleaseInstrRes(CcuCtxGroup& ctxGroup) const;
117 :
118 : HcclResult GetResPackTotalResNum(const CcuResPack& resPack, CcuResReq& totalRes) const;
119 :
120 0 : inline int32_t GetResTotalNum(const vector<ResInfo>& resInfos) const
121 : {
122 0 : int32_t resNum = 0;
123 :
124 0 : for (ResInfo resInfo : resInfos) {
125 0 : resNum += static_cast<int32_t>(resInfo.num);
126 : }
127 0 : return resNum;
128 : }
129 :
130 : CcuResReq GetCtxGroupResReq(CcuCtxGroup& ctxGroup) const;
131 :
132 : void MergeCcuResReq(CcuResReq& resReqA, const CcuResReq& resReqB) const;
133 :
134 : HcclResult
135 : CompareResAndApplyAsNeeded(const CcuResReq& totalRes, const CcuResReq& resReq, CcuResPack& resPack) const;
136 :
137 66 : inline uint32_t GetReqResNum(uint32_t reqRes, uint32_t totalRes) const
138 : {
139 66 : return ((reqRes > totalRes) ? (reqRes - totalRes) : 0);
140 : }
141 :
142 : void SaveResPackToCtx(CcuCtxGroup& ctxGroup, CcuResPack& resPack) const;
143 :
144 : HcclResult InstantiationTranslator(uint16_t dieId);
145 :
146 : HcclResult TransRepResToPhyRes(CcuCtxGroup& ctxGroup) const;
147 :
148 : HcclResult GetResPackTotalResRepository(const CcuResPack& resPack, CcuResRepository& totalRes) const;
149 :
150 154 : inline void ExpandResInfo(vector<ResInfo>& expendResInfos, const vector<ResInfo>& resInfos) const
151 : {
152 : // 将resInfo中的资源信息扩展到megedRes中
153 250 : for (auto& resInfo : resInfos) {
154 40110 : for (uint32_t id = 0; id < resInfo.num; id++) {
155 40014 : expendResInfos.push_back({(resInfo.startId + id), {1}});
156 : }
157 : }
158 154 : }
159 :
160 : CcuRepResource GetTotalCcuRepResource(CcuCtxGroup& ctxGroup) const;
161 :
162 : void MergeCtxRepResource(CcuRepResource& repResourceA, CcuRepResource& repResourceB) const;
163 :
164 : template <typename T1, typename T2>
165 : void ResetRepResourceTemplate(std::vector<T1>& resource, const std::vector<T2>& repository) const;
166 :
167 : void ResetRepResourceToResRepository(CcuRepResource& totalRepRes, const CcuResRepository& totalResRepository) const;
168 :
169 : template <typename T>
170 : void ProcessSharedResources(
171 : std::unordered_map<std::string, T>& resources,
172 : std::vector<std::unordered_map<std::string, T>>& exportedResources, uint32_t i) const;
173 :
174 : void ProcessInterCtxRes(CcuCtxGroup& ctxGroup) const;
175 :
176 : HcclResult SaveCtxMissionInfo(CcuCtxGroup& ctxGroup, array<vector<ResInfo>, MAX_CCU_IODIE_NUM>& missionId) const;
177 :
178 : void TransRepSequenceToMicrocode(CcuCtxGroup& ctxGroup, bool isFuncBlock);
179 :
180 : void LoadInstruction(CcuRep::CcuInstrInfo& instrInfo, uint32_t dieId);
181 :
182 : void DumpResReqInfo(const CcuResReq& totalRes) const;
183 :
184 : void DumpResRepositoryInfo(const CcuResRepository& resRepo) const;
185 :
186 : private:
187 : bool initializedFlag_{false};
188 :
189 : // 创建一个无序的映射,键为uint64_t类型的executorId,值为CcuRepContext的智能指针
190 : std::unordered_map<uint64_t, CcuCtxGroup> ctxGroupMap_{};
191 :
192 : // 创建一个互斥量,用于保护contextMap_的并发访问
193 : std::mutex contextMapMutex_;
194 :
195 : uint64_t executorId_ = 0;
196 :
197 : s32 deviceLogicId_ = -1;
198 :
199 : // 指令模块加载使用的device的内存地址
200 : void* instructionLoadDevMem_ = nullptr;
201 : // translator实例
202 : std::unordered_map<uint16_t, std::unordered_map<uint16_t, std::shared_ptr<CcuRepTranslator>>> translators;
203 : std::unordered_map<uint16_t, std::unordered_map<uint16_t, std::shared_ptr<CcuRepReferenceManager>>> referenceMgrs;
204 : CcuResPack translatorResPack;
205 : };
206 : }; // namespace Hccl
207 :
208 : #endif // HCCL_CCU_CTX_MGR_IMP_H
|