| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[feature]scalar头开销展示 Co-authored-by: zzzsss1234<zhanglei802@h-partners.com> # message auto-generated for no-merge-commit merge: !158 merge sim_scalar into master [feature]scalar头开销展示 Created-by: zzzsss1234 Commit-by: zzzsss1234 Merged-by: ascend-robot Description: https://gitcode.com/Ascend/msopcom/issues/48 # 1. 修改描述 - **修改原因:** 增加scalar头开销展示,辅助用户深度调优算子性能,用于追踪和分析AI处理器中指令的ICache和CCU周期开销,为性能优化提供细粒度数据支持。 - **修改方案:** ### 1.1 核心特性 - **CCU日志解析**:解析计算控制单元的标量指令执行日志 - **ICache标量解析**:解析指令缓存的标量预取信息 - **周期信息合并**:将ICache和CCU的时间戳信息关联到具体指令 - **可视化展示**:在时间线中展示标量头事件 ### 1.2 应用场景 - 分析指令fetch到execute的完整生命周期 - 识别ICache预取延迟和CCU调度延迟 - 定位性能瓶颈和优化机会 ## 2. 系统架构设计 ### 2.1 类图设计 .png') ### 2.2 核心类职责说明 #### 2.2.1 数据结构层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | DvcCcuLog | 接收来自设备侧的CCU日志数据 | 新增结构体 | | ScalarInstrInfo | 存储标量指令的周期信息 | 新增结构体 | | CcuParseInfoForRealTime | CCU解析中间数据结构 | 新增结构体 | | IcacheParseInfoForRealTime | ICache解析中间数据结构 | 新增opType字段 | | MergeInfo | 指令合并信息 | 新增icacheTick和ccuTick字段 | #### 2.2.2 解析器层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | RealTimeDataParser | 实时数据解析主控制器 | 新增SetCcuLog、InsertScalar、InsertCache方法,新增RealTimeCcuParser成员 | | RealTimeICacheParserPlugin | ICache日志解析插件 | 新增ParseScalar方法和scalarMap_成员 | | RealTimeCcuParser | CCU日志解析器 | 新增类 | | RealTimeCcuParserPlugin | CCU日志解析插件 | 新增类 | #### 2.2.3 计算器层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | ScalarCalculator | 标量周期信息计算器 | 新增类,实现MergeScalar算法 | #### 2.2.4 数据存储层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | InstrDetailTable | 指令明细数据表 | 新增ICACHE_CYC和CCU_CYC列,新增uint64DataVec_容器 | #### 2.2.5 可视化层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | CoreTimeLineVisualizer | 核心时间线可视化 | 新增AddScalarHeadEvents方法 | --- ## 3. 核心流程设计 ### 3.1 实时数据解析流程 .png') ### 3.2 标量信息计算流程 .png') ### 3.3 数据流转流程 .png') ## 4. 核心算法设计 ### 4.1 MergeScalar算法详解 **算法目标**:为每条CCU标量指令找到最接近的ICache预取时间戳。 **算法原理**: 1. ICache预取发生在指令执行之前 2. 对于同一个PC的多条指令,需要匹配: - CCU tick:指令被调度执行的时间 - ICache tick:指令被预取到缓存的时间 3. 匹配规则:找到距离ccuTick最近的icacheTick(且 icacheTick ≤ ccuTick) **核心代码**: cpp void ScalarCalculator::MergeScalar(const scalarHeadCache &icacheDetailTable, scalarHead &scalarDetailTable) { for (auto &instr : scalarDetailTable) { uint64_t pc = instr.first; std::vector<ScalarInstrInfo>& scalarVec = instr.second; // 查找相同PC的ICache信息 auto iter = icacheDetailTable.find(pc); if (iter == icacheDetailTable.end()) { continue; } const auto icacheSets = iter->second; // set<uint64_t>,按tick排序 for (auto i = 0; i < scalarVec.size(); i++) { // 使用lower_bound找第一个 >= ccuTick的元素 auto it = icacheSets.lower_bound(scalarVec[i].ccuTick); if (it == icacheSets.begin()) { break; // 没有比ccuTick小的icacheTick } // 前一个元素即为距离最近的icacheTick auto prev_it = std::prev(it); scalarVec[i].icacheTick = *prev_it; } } } **算法复杂度分析**: - 时间复杂度:O(N * log M),其中N为指令数量,M为ICache tick集合大小 - 空间复杂度:O(N),存储scalarHead数据结构 **算法优化点**: 1. 使用set存储icacheTick,自动排序,便于二分查找 2. lower_bound提供O(log M)的查找效率 3. 按PC分组处理,减少查找范围 ### 4.2 指令周期填充算法 **算法目标**:将合并后的scalar信息填充到InstrDetailTable的对应列。 **算法流程**: cpp PluginErrorCode ScalarCalculator::Entry() { // 1. 获取数据表 auto icacheDetailTable = dataCenter_.GetDbPtr<scalarHeadCache>(); auto scalarDetailTable = dataCenter_.GetDbPtr<scalarHead>(); auto instrDetailTable = dataCenter_.GetDbPtr<InstrDetailTable>(); // 2. 合并ICache和CCU信息 MergeScalar(*icacheDetailTable, *scalarDetailTable); // 3. 填充指令周期信息 const auto& mergeInfo = *instrDetailTable->GetColumnData<MergeInfo>(...); std::vector<uint64_t> icacheTicks(mergeSize, UINT64_MAX); std::vector<uint64_t> ccuTicks(mergeSize, UINT64_MAX); for (size_t idx = 0; idx < mergeSize;) { const uint64_t currentPc = mergeInfo[idx].pc; // 查找对应PC的scalar信息 auto scalarIt = scalarDetailTable->find(currentPc); if (scalarIt == scalarDetailTable->end()) { // 跳到下一个PC idx = find_next_pc(mergeInfo, idx, currentPc); continue; } // 匹配scalarEntries const auto& scalarEntries = scalarIt->second; size_t scalarIdx = 0; while (idx < mergeSize && mergeInfo[idx].pc == currentPc) { if (scalarIdx >= scalarEntries.size() || scalarEntries[scalarIdx].ccuTick > mergeInfo[idx].startTick) { // 当前PC匹配失败,跳到下一个PC idx = find_next_pc(mergeInfo, idx, currentPc); break; } // 填充周期信息 ccuTicks[idx] = scalarEntries[scalarIdx].ccuTick; icacheTicks[idx] = scalarEntries[scalarIdx].icacheTick; ++idx; ++scalarIdx; } } // 4. 更新数据表 instrDetailTable->UpdateColumnAllValue(ICACHE_CYC, icacheTicks); instrDetailTable->UpdateColumnAllValue(CCU_CYC, ccuTicks); } **关键设计点**: 1. 按PC分组处理,保证同一PC的指令顺序一致 2. 使用UINT64_MAX作为默认值,标识无scalar信息的指令 3. 匹配失败时跳到下一个PC,避免错误匹配 --- ## 5. 数据结构设计 ### 5.1 核心数据结构定义 #### 5.1.1 ScalarInstrInfo cpp struct ScalarInstrInfo { uint64_t icacheTick; // ICache预取时间戳 uint64_t ccuTick; // CCU调度时间戳 uint64_t pc; // 指令PC地址 ScalarInstrInfo(uint64_t icacheTick, uint64_t ccuTick, uint64_t pc) : icacheTick(icacheTick), ccuTick(ccuTick), pc(pc) {} }; **设计说明**: - 存储单条标量指令的完整周期信息 - icacheTick和ccuTick用于计算指令的fetch-execute延迟 - pc用于关联到具体指令 #### 5.1.2 scalarHead和scalarHeadCache cpp using scalarHead = std::map<uint64_t, std::vector<ScalarInstrInfo>>; using scalarHeadCache = std::map<uint64_t, std::set<uint64_t>>; **设计说明**: - scalarHead:以PC为key,存储CCU的标量指令信息 - scalarHeadCache:以PC为key,存储ICache的tick集合(使用set自动排序) #### 5.1.3 MergeInfo扩展 cpp struct MergeInfo : InstrParseInfo { uint64_t icacheTick; // 新增:ICache预取时间戳 uint64_t ccuTick; // 新增:CCU调度时间戳 uint64_t startTick; // 指令开始执行时间戳 uint64_t endTick; // 指令结束执行时间戳 uint64_t pc; string name; string detail; ... }; **设计说明**: - 新增icacheTick和ccuTick字段 - 形成完整的指令生命周期时间戳序列: - icacheTick → ccuTick → startTick → endTick #### 5.1.4 InstrDetailTable扩展 cpp class InstrDetailTable { public: static constexpr uint32_t ICACHE_CYC = 3; // 新增列索引 static constexpr uint32_t CCU_CYC = 4; // 新增列索引 private: std::vector<std::shared_ptr<std::vector<uint64_t>>> uint64DataVec_; // 新增 ... }; **设计说明**: - 新增uint64DataVec_容器,存储uint64_t类型列数据 - ICACHE_CYC和CCU_CYC列用于存储周期信息 - 默认值为UINT64_MAX(无数据) --- ## 6. 接口设计 ### 6.1 对外接口 #### 6.1.1 RealTimeDataParser新增接口 | 接口签名 | 功能说明 | |---------|---------| | void SetCcuLog(const Common::DvcCcuLog &ccuLog) | 接收CCU日志数据 | | void InsertScalar(DataCenterMap &dataCenterMap) | 插入scalar信息到数据中心 | | void InsertCache(DataCenterMap &dataCenterMap) | 插入cache信息到数据中心 | #### 6.1.2 配置接口 | 配置项 | 功能说明 | |-------|---------| | MsprofMetrics::OVERHEAD | 标量周期分析开关 | **使用示例**: cpp // 启用overhead分析 metricsConfig.overHead = true; // 接收CCU日志 DvcCcuLog ccuLog = {...}; realTimeDataParser.SetCcuLog(ccuLog); // 处理后会自动执行ScalarCalculator // 结果存储在InstrDetailTable的ICACHE_CYC和CCU_CYC列 --- ## 7. 性能考虑 ### 7.1 性能优化措施 | 优化点 | 优化方法 | 效果 | |-------|---------|------| | ICache tick查找 | 使用set存储,自动排序 | O(log M)查找效率 | | PC分组处理 | 按PC分组,减少查找范围 | 减少无效查找 | | 数据结构选择 | scalarHeadCache使用map+set | 内存占用+查找效率平衡 | | 并行处理 | 多个解析器并行运行 | 提升实时解析性能 | ### 7.2 内存占用分析 | 数据结构 | 大小估算 | 说明 | |---------|---------|------| | scalarHeadCache | O(P * T) | P为PC数量,T为平均tick数量 | | scalarHead | O(P * N) | P为PC数量,N为平均指令数量 | | InstrDetailTable uint64列 | O(M) | M为总指令数量 | **总内存占用**:约 O(P * T + P * N + M) --- ## 8. 扩展性设计 ### 8.1 插件化架构 - ScalarCalculator继承InstrDetailCalculator,符合插件接口规范 - RealTimeCcuParserPlugin继承PluginInterface,符合插件管理器规范 - 新增计算逻辑只需添加新的Calculator插件 ### 8.2 数据结构扩展 - InstrDetailTable采用列存储设计,易于新增列 - MergeInfo结构可扩展,添加新的时间戳字段 ### 8.3 配置驱动 - 通过metricsConfig.overHead开关控制功能启用 - 未来可扩展更多overhead相关配置项 --- - [ ] **涉及代码双合**(贴上另一个PR链接): ---- # 2. 功能验证 - [ ] **功能自验截图**(效果图需仿真器组件合入后展示) - [ ] **冒烟是否通过** 是 ---- # 3. 代码检视 - **要求:** - 合入功能代码大于 200 行,需要sig会议申报代码检视议题,并在PR中标注会议。 - committer评估是否需要在sig会议进行代码检视。 - 参与检视的committer人员名单与检视时间。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** 是 - [ ] **是否具备UT测试用例看护** 是 - [ ] **是否需要在sig会议中进行代码检视** 否 - **检视committer人员名单与检视时间:** [@yan_yw](https://gitcode.com/yan_yw) [@RainbowWhp](https://gitcode.com/RainbowWhp) [@zsz_wlf](https://gitcode.com/zsz_wlf) ---- # 4. 资料修改自检 - **资料修改:** ---- See merge request: Ascend/msopprof!158 | 1 个月前 | |
[feature] 动态插桩细化搬运通路,新增SIMT类指令桩 Co-authored-by: zsz<zhaishangzhao@huawei.com> # message auto-generated for no-merge-commit merge: !173 merge br_dbi into master [feature] 动态插桩细化搬运通路,新增SIMT类指令桩 Created-by: zsz_wlf Commit-by: zsz Merged-by: ascend-robot Description: # 1. 修改描述 - **修改原因:** 当前由于硬件限制,无法获取某些内存通路数据,因此需要借助动态插桩能力,获取相应内存通路数据; - **修改方案:** 新增SIMT搬运类以及计算类指令桩,并统计相应内存通路数据,用于细化内存热力图图线以及上板指标; - **修改内容:** 修改动态插桩相关文件,新增SIMT类指令桩; - [ ] **涉及代码双合**(贴上另一个PR链接): ---- # 2. 功能验证 - [x] **功能自验截图**(请确保不体现个人信息) 根据是否使能memorydetail 决定是否要细化内存热力图 - [x] **冒烟是否通过**  ---- # 3. 代码检视 - **要求:** - 合入功能代码大于 200 行,需要sig会议申报代码检视议题,并在PR中标注会议。 - committer评估是否需要在sig会议进行代码检视。 - 参与检视的committer人员名单与检视时间。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [x] **是否经过代码检视** - [x] **是否具备UT测试用例看护** - [ ] **是否需要在sig会议中进行代码检视** - **检视committer人员名单与检视时间:** ---- # 4. 资料修改自检 - **资料修改:** ---- See merge request: Ascend/msopprof!173 | 29 天前 | |
[feature]scalar头开销展示 Co-authored-by: zzzsss1234<zhanglei802@h-partners.com> # message auto-generated for no-merge-commit merge: !158 merge sim_scalar into master [feature]scalar头开销展示 Created-by: zzzsss1234 Commit-by: zzzsss1234 Merged-by: ascend-robot Description: https://gitcode.com/Ascend/msopcom/issues/48 # 1. 修改描述 - **修改原因:** 增加scalar头开销展示,辅助用户深度调优算子性能,用于追踪和分析AI处理器中指令的ICache和CCU周期开销,为性能优化提供细粒度数据支持。 - **修改方案:** ### 1.1 核心特性 - **CCU日志解析**:解析计算控制单元的标量指令执行日志 - **ICache标量解析**:解析指令缓存的标量预取信息 - **周期信息合并**:将ICache和CCU的时间戳信息关联到具体指令 - **可视化展示**:在时间线中展示标量头事件 ### 1.2 应用场景 - 分析指令fetch到execute的完整生命周期 - 识别ICache预取延迟和CCU调度延迟 - 定位性能瓶颈和优化机会 ## 2. 系统架构设计 ### 2.1 类图设计 .png') ### 2.2 核心类职责说明 #### 2.2.1 数据结构层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | DvcCcuLog | 接收来自设备侧的CCU日志数据 | 新增结构体 | | ScalarInstrInfo | 存储标量指令的周期信息 | 新增结构体 | | CcuParseInfoForRealTime | CCU解析中间数据结构 | 新增结构体 | | IcacheParseInfoForRealTime | ICache解析中间数据结构 | 新增opType字段 | | MergeInfo | 指令合并信息 | 新增icacheTick和ccuTick字段 | #### 2.2.2 解析器层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | RealTimeDataParser | 实时数据解析主控制器 | 新增SetCcuLog、InsertScalar、InsertCache方法,新增RealTimeCcuParser成员 | | RealTimeICacheParserPlugin | ICache日志解析插件 | 新增ParseScalar方法和scalarMap_成员 | | RealTimeCcuParser | CCU日志解析器 | 新增类 | | RealTimeCcuParserPlugin | CCU日志解析插件 | 新增类 | #### 2.2.3 计算器层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | ScalarCalculator | 标量周期信息计算器 | 新增类,实现MergeScalar算法 | #### 2.2.4 数据存储层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | InstrDetailTable | 指令明细数据表 | 新增ICACHE_CYC和CCU_CYC列,新增uint64DataVec_容器 | #### 2.2.5 可视化层 | 类名 | 职责 | 关键变更 | |-----|-----|---------| | CoreTimeLineVisualizer | 核心时间线可视化 | 新增AddScalarHeadEvents方法 | --- ## 3. 核心流程设计 ### 3.1 实时数据解析流程 .png') ### 3.2 标量信息计算流程 .png') ### 3.3 数据流转流程 .png') ## 4. 核心算法设计 ### 4.1 MergeScalar算法详解 **算法目标**:为每条CCU标量指令找到最接近的ICache预取时间戳。 **算法原理**: 1. ICache预取发生在指令执行之前 2. 对于同一个PC的多条指令,需要匹配: - CCU tick:指令被调度执行的时间 - ICache tick:指令被预取到缓存的时间 3. 匹配规则:找到距离ccuTick最近的icacheTick(且 icacheTick ≤ ccuTick) **核心代码**: cpp void ScalarCalculator::MergeScalar(const scalarHeadCache &icacheDetailTable, scalarHead &scalarDetailTable) { for (auto &instr : scalarDetailTable) { uint64_t pc = instr.first; std::vector<ScalarInstrInfo>& scalarVec = instr.second; // 查找相同PC的ICache信息 auto iter = icacheDetailTable.find(pc); if (iter == icacheDetailTable.end()) { continue; } const auto icacheSets = iter->second; // set<uint64_t>,按tick排序 for (auto i = 0; i < scalarVec.size(); i++) { // 使用lower_bound找第一个 >= ccuTick的元素 auto it = icacheSets.lower_bound(scalarVec[i].ccuTick); if (it == icacheSets.begin()) { break; // 没有比ccuTick小的icacheTick } // 前一个元素即为距离最近的icacheTick auto prev_it = std::prev(it); scalarVec[i].icacheTick = *prev_it; } } } **算法复杂度分析**: - 时间复杂度:O(N * log M),其中N为指令数量,M为ICache tick集合大小 - 空间复杂度:O(N),存储scalarHead数据结构 **算法优化点**: 1. 使用set存储icacheTick,自动排序,便于二分查找 2. lower_bound提供O(log M)的查找效率 3. 按PC分组处理,减少查找范围 ### 4.2 指令周期填充算法 **算法目标**:将合并后的scalar信息填充到InstrDetailTable的对应列。 **算法流程**: cpp PluginErrorCode ScalarCalculator::Entry() { // 1. 获取数据表 auto icacheDetailTable = dataCenter_.GetDbPtr<scalarHeadCache>(); auto scalarDetailTable = dataCenter_.GetDbPtr<scalarHead>(); auto instrDetailTable = dataCenter_.GetDbPtr<InstrDetailTable>(); // 2. 合并ICache和CCU信息 MergeScalar(*icacheDetailTable, *scalarDetailTable); // 3. 填充指令周期信息 const auto& mergeInfo = *instrDetailTable->GetColumnData<MergeInfo>(...); std::vector<uint64_t> icacheTicks(mergeSize, UINT64_MAX); std::vector<uint64_t> ccuTicks(mergeSize, UINT64_MAX); for (size_t idx = 0; idx < mergeSize;) { const uint64_t currentPc = mergeInfo[idx].pc; // 查找对应PC的scalar信息 auto scalarIt = scalarDetailTable->find(currentPc); if (scalarIt == scalarDetailTable->end()) { // 跳到下一个PC idx = find_next_pc(mergeInfo, idx, currentPc); continue; } // 匹配scalarEntries const auto& scalarEntries = scalarIt->second; size_t scalarIdx = 0; while (idx < mergeSize && mergeInfo[idx].pc == currentPc) { if (scalarIdx >= scalarEntries.size() || scalarEntries[scalarIdx].ccuTick > mergeInfo[idx].startTick) { // 当前PC匹配失败,跳到下一个PC idx = find_next_pc(mergeInfo, idx, currentPc); break; } // 填充周期信息 ccuTicks[idx] = scalarEntries[scalarIdx].ccuTick; icacheTicks[idx] = scalarEntries[scalarIdx].icacheTick; ++idx; ++scalarIdx; } } // 4. 更新数据表 instrDetailTable->UpdateColumnAllValue(ICACHE_CYC, icacheTicks); instrDetailTable->UpdateColumnAllValue(CCU_CYC, ccuTicks); } **关键设计点**: 1. 按PC分组处理,保证同一PC的指令顺序一致 2. 使用UINT64_MAX作为默认值,标识无scalar信息的指令 3. 匹配失败时跳到下一个PC,避免错误匹配 --- ## 5. 数据结构设计 ### 5.1 核心数据结构定义 #### 5.1.1 ScalarInstrInfo cpp struct ScalarInstrInfo { uint64_t icacheTick; // ICache预取时间戳 uint64_t ccuTick; // CCU调度时间戳 uint64_t pc; // 指令PC地址 ScalarInstrInfo(uint64_t icacheTick, uint64_t ccuTick, uint64_t pc) : icacheTick(icacheTick), ccuTick(ccuTick), pc(pc) {} }; **设计说明**: - 存储单条标量指令的完整周期信息 - icacheTick和ccuTick用于计算指令的fetch-execute延迟 - pc用于关联到具体指令 #### 5.1.2 scalarHead和scalarHeadCache cpp using scalarHead = std::map<uint64_t, std::vector<ScalarInstrInfo>>; using scalarHeadCache = std::map<uint64_t, std::set<uint64_t>>; **设计说明**: - scalarHead:以PC为key,存储CCU的标量指令信息 - scalarHeadCache:以PC为key,存储ICache的tick集合(使用set自动排序) #### 5.1.3 MergeInfo扩展 cpp struct MergeInfo : InstrParseInfo { uint64_t icacheTick; // 新增:ICache预取时间戳 uint64_t ccuTick; // 新增:CCU调度时间戳 uint64_t startTick; // 指令开始执行时间戳 uint64_t endTick; // 指令结束执行时间戳 uint64_t pc; string name; string detail; ... }; **设计说明**: - 新增icacheTick和ccuTick字段 - 形成完整的指令生命周期时间戳序列: - icacheTick → ccuTick → startTick → endTick #### 5.1.4 InstrDetailTable扩展 cpp class InstrDetailTable { public: static constexpr uint32_t ICACHE_CYC = 3; // 新增列索引 static constexpr uint32_t CCU_CYC = 4; // 新增列索引 private: std::vector<std::shared_ptr<std::vector<uint64_t>>> uint64DataVec_; // 新增 ... }; **设计说明**: - 新增uint64DataVec_容器,存储uint64_t类型列数据 - ICACHE_CYC和CCU_CYC列用于存储周期信息 - 默认值为UINT64_MAX(无数据) --- ## 6. 接口设计 ### 6.1 对外接口 #### 6.1.1 RealTimeDataParser新增接口 | 接口签名 | 功能说明 | |---------|---------| | void SetCcuLog(const Common::DvcCcuLog &ccuLog) | 接收CCU日志数据 | | void InsertScalar(DataCenterMap &dataCenterMap) | 插入scalar信息到数据中心 | | void InsertCache(DataCenterMap &dataCenterMap) | 插入cache信息到数据中心 | #### 6.1.2 配置接口 | 配置项 | 功能说明 | |-------|---------| | MsprofMetrics::OVERHEAD | 标量周期分析开关 | **使用示例**: cpp // 启用overhead分析 metricsConfig.overHead = true; // 接收CCU日志 DvcCcuLog ccuLog = {...}; realTimeDataParser.SetCcuLog(ccuLog); // 处理后会自动执行ScalarCalculator // 结果存储在InstrDetailTable的ICACHE_CYC和CCU_CYC列 --- ## 7. 性能考虑 ### 7.1 性能优化措施 | 优化点 | 优化方法 | 效果 | |-------|---------|------| | ICache tick查找 | 使用set存储,自动排序 | O(log M)查找效率 | | PC分组处理 | 按PC分组,减少查找范围 | 减少无效查找 | | 数据结构选择 | scalarHeadCache使用map+set | 内存占用+查找效率平衡 | | 并行处理 | 多个解析器并行运行 | 提升实时解析性能 | ### 7.2 内存占用分析 | 数据结构 | 大小估算 | 说明 | |---------|---------|------| | scalarHeadCache | O(P * T) | P为PC数量,T为平均tick数量 | | scalarHead | O(P * N) | P为PC数量,N为平均指令数量 | | InstrDetailTable uint64列 | O(M) | M为总指令数量 | **总内存占用**:约 O(P * T + P * N + M) --- ## 8. 扩展性设计 ### 8.1 插件化架构 - ScalarCalculator继承InstrDetailCalculator,符合插件接口规范 - RealTimeCcuParserPlugin继承PluginInterface,符合插件管理器规范 - 新增计算逻辑只需添加新的Calculator插件 ### 8.2 数据结构扩展 - InstrDetailTable采用列存储设计,易于新增列 - MergeInfo结构可扩展,添加新的时间戳字段 ### 8.3 配置驱动 - 通过metricsConfig.overHead开关控制功能启用 - 未来可扩展更多overhead相关配置项 --- - [ ] **涉及代码双合**(贴上另一个PR链接): ---- # 2. 功能验证 - [ ] **功能自验截图**(效果图需仿真器组件合入后展示) - [ ] **冒烟是否通过** 是 ---- # 3. 代码检视 - **要求:** - 合入功能代码大于 200 行,需要sig会议申报代码检视议题,并在PR中标注会议。 - committer评估是否需要在sig会议进行代码检视。 - 参与检视的committer人员名单与检视时间。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** 是 - [ ] **是否具备UT测试用例看护** 是 - [ ] **是否需要在sig会议中进行代码检视** 否 - **检视committer人员名单与检视时间:** [@yan_yw](https://gitcode.com/yan_yw) [@RainbowWhp](https://gitcode.com/RainbowWhp) [@zsz_wlf](https://gitcode.com/zsz_wlf) ---- # 4. 资料修改自检 - **资料修改:** ---- See merge request: Ascend/msopprof!158 | 1 个月前 | |
[refactor]cleancode问题修改 Co-authored-by: yan_yw<yanyuwei2@huawei.com> # message auto-generated for no-merge-commit merge: !72 merge cleancode into master [refactor]cleancode问题修改 Created-by: yan_yw Commit-by: yan_yw Merged-by: ascend-robot Description: ### 1. 修改描述 - **修改原因:** cleancode问题修改:https://www.openlibing.com/apps/versionCheckDashCode/69badc6f8029c937d0b62153/6d1738eb55b54d0a87c53608e06e972a?projectId=300037 - **修改方案:** 按照修改建议修改 - **修改内容:** 增加类内函数const、.h顺序修改、除零问题等 - [ ] **涉及代码双合**(贴上另一个PR链接): ---- ### 2. 功能验证 - [x] **功能自验截图**(请确保不体现个人信息) - [x] **冒烟是否通过** ---- ### 3. 代码检视 - **要求:** - 合入功能代码大于 200 行,需要sig会议申报代码检视议题,并在PR中标注会议。 - committer评估是否需要在sig会议进行代码检视。 - 参与检视的committer人员名单与检视时间。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [x] **是否经过代码检视** - [x] **是否具备UT测试用例看护** - [x] **是否需要在sig会议中进行代码检视** - **检视committer人员名单与检视时间:** ---- ### 4. 资料修改自检 - **资料修改:** ---- See merge request: Ascend/msopprof!72 | 3 个月前 | |
[refactor]cleancode问题修改 Co-authored-by: yan_yw<yanyuwei2@huawei.com> # message auto-generated for no-merge-commit merge: !72 merge cleancode into master [refactor]cleancode问题修改 Created-by: yan_yw Commit-by: yan_yw Merged-by: ascend-robot Description: ### 1. 修改描述 - **修改原因:** cleancode问题修改:https://www.openlibing.com/apps/versionCheckDashCode/69badc6f8029c937d0b62153/6d1738eb55b54d0a87c53608e06e972a?projectId=300037 - **修改方案:** 按照修改建议修改 - **修改内容:** 增加类内函数const、.h顺序修改、除零问题等 - [ ] **涉及代码双合**(贴上另一个PR链接): ---- ### 2. 功能验证 - [x] **功能自验截图**(请确保不体现个人信息) - [x] **冒烟是否通过** ---- ### 3. 代码检视 - **要求:** - 合入功能代码大于 200 行,需要sig会议申报代码检视议题,并在PR中标注会议。 - committer评估是否需要在sig会议进行代码检视。 - 参与检视的committer人员名单与检视时间。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [x] **是否经过代码检视** - [x] **是否具备UT测试用例看护** - [x] **是否需要在sig会议中进行代码检视** - **检视committer人员名单与检视时间:** ---- ### 4. 资料修改自检 - **资料修改:** ---- See merge request: Ascend/msopprof!72 | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 29 天前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 3 个月前 |