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: 33.3 % 3 1
Test Date: 2026-08-04 10:52:23 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.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 &paraCfg, 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 
        

Generated by: LCOV version 2.0-1