LCOV - code coverage report
Current view: top level - legacy/ascend950/unified_platform/pub_inc/ccu - ccu_ctx.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 50.0 % 2 1
Test Date: 2026-08-18 17:47:01 Functions: 50.0 % 2 1

            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
        

Generated by: LCOV version 2.0-1