LCOV - code coverage report
Current view: top level - legacy/ascend910/algorithm/pub_inc - common.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 57.8 % 64 37
Test Date: 2026-08-18 17:47:01 Functions: 85.7 % 7 6

            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 COMMON_H
      12              : #define COMMON_H
      13              : 
      14              : #include "adapter_hccp_common.h"
      15              : #include "hccl_ip_address.h"
      16              : #include "hccl_common.h"
      17              : #include "alg_cmd_type.h"
      18              : #include "transport_pub.h"
      19              : #include "externalinput_pub.h"
      20              : #include "template_v1_utils.h"
      21              : #include "comm_utils.h"
      22              : 
      23              : // sub stream 相关
      24              : constexpr s64 HCCL_SUB_STREAM_NUM_ZERO = 0;        // subStream 数量为0
      25              : constexpr s64 HCCL_SUB_STREAM_NUM_DOUBLE_RING = 1; // subStream 数量为1
      26              : constexpr s64 HCCL_SUB_STREAM_NUM_4P_MESH = 2;     // subStream 数量为2
      27              : constexpr s64 HCCL_SUB_STREAM_NUM_8P_RING = 3;     // subStream 数量为3
      28              : constexpr s64 HCCL_SUB_STREAM_NP_MESH = 2;         // NP MESH场景下subStream数应为ranksize - 2
      29              : 
      30              : // HCCL通信算法类型
      31              : enum class HcclAlgoType {
      32              :     HCCL_ALGO_TYPE_DEFAULT = 0, // 默认算法,配置为此时,使用HCCL内藏算法选择逻辑
      33              :     HCCL_ALGO_TYPE_RING,
      34              :     HCCL_ALGO_TYPE_PIPELINE,
      35              :     HCCL_ALGO_TYPE_FULLMESH,
      36              :     HCCL_ALGO_TYPE_HDR,
      37              :     HCCL_ALGO_TYPE_PAIRWISE,
      38              :     HCCL_ALGO_TYPE_NHR,
      39              :     HCCL_ALGO_TYPE_NHR_V1,
      40              :     HCCL_ALGO_TYPE_NB,
      41              :     HCCL_ALGO_TYPE_NULL,
      42              :     HCCL_ALGO_TYPE_NA,
      43              :     HCCL_ALGO_TYPE_AHC,
      44              :     HCCL_ALGO_TYPE_AHC_BROKE,
      45              : };
      46              : 
      47              : // 对内拓扑算法枚举
      48              : enum class AlgTypeLevel0 {
      49              :     ALG_LEVEL0_WHOLE_RING = 0, // 单层拓扑, 所有level均为Whole ring时,组成一个大环
      50              :     ALG_LEVEL0_8P_RING,        // 拓扑组合0层, Ring 节点内4个固定stream
      51              :     ALG_LEVEL0_4P_MESH,        // 拓扑组合0层, Mesh 节点内3个固定stream
      52              :     ALG_LEVEL0_2P_MESH,        // 拓扑组合0层, Mesh
      53              :     ALG_LEVEL0_1P_MESH,        // 拓扑组合0层, Mesh
      54              :     ALG_LEVEL0_4P_RING,        // 拓扑组合0层, Ring
      55              :     ALG_LEVEL0_NP_SINGLE_RING, // 拓扑组合0层, Ring
      56              :     ALG_LEVEL0_NP_DOUBLE_RING, // 拓扑组合0层, double Ring
      57              :     ALG_LEVEL0_NP_MESH,        // 拓扑组合0层, 服务器内3~8p rank组成MESH
      58              :     ALG_LEVEL0_NP_HD,          // 拓扑组合0层, HD
      59              :     ALG_LEVEL0_NP_STAR,
      60              :     ALG_LEVEL0_PAIRWISE,
      61              :     ALG_LEVEL0_RESERVED
      62              : };
      63              : 
      64              : enum class AlgTypeLevel1 {
      65              :     ALG_LEVEL1_WHOLE_RING = 0, // 单层拓扑, 所有level均为Whole ring时,组成一个大环
      66              :     ALG_LEVEL1_HD,             // 拓扑组合1层, HDR
      67              :     ALG_LEVEL1_RING,           // 拓扑组合1层, Ring
      68              :     ALG_LEVEL1_PIPELINE,       // 拓扑组合1层, Pipeline
      69              :     ALG_LEVEL1_STAR,
      70              :     ALG_LEVEL1_NHR,       // 拓扑组合1层,NHR
      71              :     ALG_LEVEL1_NHR_V1,    // 拓扑组合1层,NHR_V1
      72              :     ALG_LEVEL1_NB,        // 拓扑组合1层,NB
      73              :     ALG_LEVEL1_AHC,       // 拓扑组合1层,AHC
      74              :     ALG_LEVEL1_AHC_BROKE, // 拓扑组合1层,AHC_BROKE
      75              :     ALG_LEVEL1_RESERVED
      76              : };
      77              : 
      78              : enum class AlgTypeLevel2 {
      79              :     ALG_LEVEL2_WHOLE_RING = 0, // 单层拓扑, 所有leve2均为Whole ring时,组成一个大环
      80              :     ALG_LEVEL2_HD,             // 拓扑组合2层, HDR
      81              :     ALG_LEVEL2_RING,           // 拓扑组合2层, Ring
      82              :     ALG_LEVEL2_NHR,            // 拓扑组合2层, NHR
      83              :     ALG_LEVEL2_NB,             // 拓扑组合2层, NB
      84              :     ALG_LEVEL2_PIPELINE,       // 拓扑组合2层, Pipeline
      85              :     ALG_LEVEL2_RESERVED
      86              : };
      87              : 
      88              : using AlgType = struct TagAlgType {
      89              :     AlgTypeLevel0 algoLevel0;
      90              :     AlgTypeLevel1 algoLevel1;
      91              :     AlgTypeLevel2 algoLevel2;
      92        59634 :     TagAlgType()
      93        59634 :         : algoLevel0(AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING),
      94        59634 :           algoLevel1(AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING),
      95        59634 :           algoLevel2(AlgTypeLevel2::ALG_LEVEL2_WHOLE_RING)
      96        59634 :     {}
      97              : 
      98              :     explicit TagAlgType(AlgTypeLevel0 algoLevel0)
      99              :         : algoLevel0(algoLevel0),
     100              :           algoLevel1(AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING),
     101              :           algoLevel2(AlgTypeLevel2::ALG_LEVEL2_WHOLE_RING)
     102              :     {}
     103              :     TagAlgType(AlgTypeLevel0 algoLevel0, AlgTypeLevel1 algoLevel1)
     104              :         : algoLevel0(algoLevel0),
     105              :           algoLevel1(algoLevel1),
     106              :           algoLevel2(AlgTypeLevel2::ALG_LEVEL2_WHOLE_RING)
     107              :     {}
     108              : 
     109              :     TagAlgType(AlgTypeLevel0 algoLevel0, AlgTypeLevel2 algoLevel2)
     110              :         : algoLevel0(algoLevel0),
     111              :           algoLevel1(AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING),
     112              :           algoLevel2(algoLevel2)
     113              :     {}
     114              : 
     115           60 :     TagAlgType(AlgTypeLevel0 algoLevel0, AlgTypeLevel1 algoLevel1, AlgTypeLevel2 algoLevel2)
     116           60 :         : algoLevel0(algoLevel0),
     117           60 :           algoLevel1(algoLevel1),
     118           60 :           algoLevel2(algoLevel2)
     119           60 :     {}
     120              :     explicit TagAlgType(AlgTypeLevel1 algoLevel1)
     121              :         : algoLevel0(AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING),
     122              :           algoLevel1(algoLevel1),
     123              :           algoLevel2(AlgTypeLevel2::ALG_LEVEL2_WHOLE_RING)
     124              :     {}
     125              : 
     126              :     TagAlgType(AlgTypeLevel1 algoLevel1, AlgTypeLevel2 algoLevel2)
     127              :         : algoLevel0(AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING),
     128              :           algoLevel1(algoLevel1),
     129              :           algoLevel2(algoLevel2)
     130              :     {}
     131              : 
     132              :     explicit TagAlgType(AlgTypeLevel2 algoLevel2)
     133              :         : algoLevel0(AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING),
     134              :           algoLevel1(AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING),
     135              :           algoLevel2(algoLevel2)
     136              :     {}
     137              : 
     138           60 :     static TagAlgType Reserved()
     139              :     {
     140              :         return TagAlgType(
     141           60 :             AlgTypeLevel0::ALG_LEVEL0_RESERVED, AlgTypeLevel1::ALG_LEVEL1_RESERVED, AlgTypeLevel2::ALG_LEVEL2_RESERVED);
     142              :     }
     143              : 
     144        18848 :     TagAlgType(const TagAlgType& that)
     145        18848 :         : algoLevel0(that.algoLevel0),
     146        18848 :           algoLevel1(that.algoLevel1),
     147        18848 :           algoLevel2(that.algoLevel2)
     148        18848 :     {}
     149              : 
     150      2460813 :     TagAlgType& operator=(const TagAlgType& that)
     151              :     {
     152      2460813 :         if (&that != this) {
     153      2460813 :             algoLevel0 = that.algoLevel0;
     154      2460813 :             algoLevel1 = that.algoLevel1;
     155      2460813 :             algoLevel2 = that.algoLevel2;
     156              :         }
     157      2460813 :         return *this;
     158              :     }
     159              : };
     160              : 
     161              : namespace hccl {
     162              : // 通信域内rank信息
     163              : using RankInfo = struct TagRankInfo {
     164              : public:
     165              :     /* * 用户的原始属性 */
     166              :     u32 userRank{INVALID_UINT};                  // 当前rank的user rank ID
     167              :     u32 worldRank{INVALID_UINT};                 // 当前rank的global user rank ID
     168              :     u32 localRank{INVALID_UINT};                 // 当前rank在server内的rank ID
     169              :     s32 devicePhyId{-1};                         // 当前rank在操作的设备物理编号
     170              :     DevType deviceType{DevType::DEV_TYPE_NOSOC}; // 当前rank在操作的设备属性
     171              :     std::vector<HcclIpAddress> nicIp;            // 当前rank所归属网卡的IP值(实际建链所用网卡IP)
     172              :     std::vector<HcclIpAddress> backupNicIp;      // 当前rank所在卡备用网卡的IP值
     173              :     u32 deviceNicPort{HCCL_INVALID_PORT};        // 当前rank使用的device socket port
     174              :     u32 deviceVnicPort{HCCL_INVALID_PORT};       // 当前rank使用的device socket port
     175              :     u32 backupDevicePort{HCCL_INVALID_PORT};     // 当前rank使用的备用网卡的device socket port
     176              :     std::vector<u32> nicIdx;                     // 当前rank在server内的所有device网卡位置(devicePhyId)
     177              :     NICDeployment nicDeploy{NICDeployment::NIC_DEPLOYMENT_DEVICE}; // 参数平面位置 0:host 1:device other:reserve
     178              :     HcclIpAddress hostIp;                                          // 当前rank使用的host socket addr
     179              :     u32 hostPort{HCCL_INVALID_PORT};                               // 当前rank使用的host socket port
     180              :     std::string serverId{""};        // 当前rank所在服务器的唯一标识值 (rank_table中的server id)
     181              :     u32 serverIdx{INVALID_UINT};     // Server在ranktable中的自然顺序(用户指定)
     182              :     u32 superDeviceId{INVALID_UINT}; // 当前rank所在的超节点内的device id(sdid)
     183              :     std::string superPodId{""};      // 当前rank所在超节点id
     184              :     u32 superPodIdx{INVALID_UINT};   // SuperPod在ranktable中的自然顺序(用户指定)
     185              :     HcclIpAddress deviceVnicIp; // 当前rank所归属网卡的虚拟ip                                                //
     186              :                                 // 当前rank所在通信域的server数
     187              : };
     188              : 
     189              : constexpr s64 HCCL_SMALL_COUNT_128_KB = 128 * 1024; // hccl 910B/310P duo卡单算子小数据量标准,暂定128kb
     190              : constexpr s64 HCCL_SMALL_COUNT_GRAPH_64_KB = 64 * 1024;       // hccl图模式小数据量标准,暂定64KB
     191              : constexpr s64 HCCL_MEDIUM_COUNT_GRAPH_4_MB = 4 * 1024 * 1024; // hccl图模式中数据量标准,暂定4MB
     192              : constexpr s64 HCCL_SMALL_COUNT_256_KB = 256 * 1024;           // 910B/310p V卡hccl小数据量标准,暂定256KB
     193              : 
     194              : constexpr s64 HCCL_ALIGN_COUNT_32_B = 32;           // 910B aiv+rdma,中数据量情况下按照32B对齐
     195              : constexpr s64 HCCL_SMALL_COUNT_190_KB = 190 * 1024; // 910B aiv+rdma,暂定从OutAIVBuffer的512K位置开始存放标记
     196              : constexpr s64 HCCL_SMALL_COUNT_512_KB = 512 * 1024; // 910B aiv+rdma,暂定从OutAIVBuffer的512K位置开始存放标记
     197              : constexpr s64 HCCL_SMALL_COUNT_1_MB = 1024 * 1024; // 910BB aiv+rdma,AIVIN的最后1M空间用作标记区
     198              : constexpr s64 HCCL_SMALL_COUNT_2_MB = 2048 * 1024;
     199              : constexpr s64 HCCL_SMALL_COUNT_4_MB = 4096 * 1024;
     200              : constexpr s64 HCCL_SMALL_COUNT_8_MB = 8192 * 1024;
     201              : constexpr s64 HCCL_SMALL_COUNT_16_KB = 16 * 1024;      // A3打平ROCE
     202              : constexpr s64 HCCL_MID_COUNT_16_MB = 16 * 1024 * 1024; // 910B aiv+rdma 中数据量支持上限
     203              : constexpr s64 HCCL_MID_COUNT_32_MB = 32 * 1024 * 1024;
     204              : 
     205              : constexpr u32 HCCL_INTER_SERVER_RING_ALGO_MAX_SUPPORT_SERVER_NUM = 8; // server 间 ring 算法支持的最大server数: 8
     206              : 
     207              : constexpr u32 HCCL_ALLTOALLV_P2P_SIZE = 2; // alltoallv不区分全连接、分级的最大ranksize
     208              : 
     209              : constexpr u32 HCCL_MEMSIZE_HD_FACTOR = 4;
     210              : 
     211              : // a2a前置allgather和a2a注册的notify资源要隔离, tag不能包含HCCL_ALLTOALL字符串
     212              : const std::string HCCL_ALLTOALL_PARA_ALLGATHER = "AllgatherForCollectA2APara";
     213              : 
     214              : // 标识MC2多机的tag后缀,用于区分单机和多机MC2场景,避免资源复用出错
     215              : const std::string HCCL_MC2_MULTISERVER_SUFFIX = "_MC2MultiServer";
     216              : 
     217              : const std::map<AlgTypeLevel0, std::string> HCCL_ALGO_LEVEL0_NAME_MAP = {
     218              :     {AlgTypeLevel0::ALG_LEVEL0_NP_DOUBLE_RING, "ring"}, {AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING, "ring"},
     219              :     {AlgTypeLevel0::ALG_LEVEL0_8P_RING, "ring"},        {AlgTypeLevel0::ALG_LEVEL0_4P_MESH, "fullmesh"},
     220              :     {AlgTypeLevel0::ALG_LEVEL0_2P_MESH, "fullmesh"},    {AlgTypeLevel0::ALG_LEVEL0_1P_MESH, "fullmesh"},
     221              :     {AlgTypeLevel0::ALG_LEVEL0_4P_RING, "ring"},        {AlgTypeLevel0::ALG_LEVEL0_NP_SINGLE_RING, "ring"},
     222              :     {AlgTypeLevel0::ALG_LEVEL0_NP_MESH, "fullmesh"},    {AlgTypeLevel0::ALG_LEVEL0_NP_HD, "HD"},
     223              :     {AlgTypeLevel0::ALG_LEVEL0_NP_STAR, "star"},        {AlgTypeLevel0::ALG_LEVEL0_RESERVED, "null"},
     224              : };
     225              : 
     226              : const std::map<AlgTypeLevel1, std::string> HCCL_ALGO_LEVEL1_NAME_MAP = {
     227              :     {AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING, "ring"}, {AlgTypeLevel1::ALG_LEVEL1_HD, "H-D"},
     228              :     {AlgTypeLevel1::ALG_LEVEL1_RING, "ring"},       {AlgTypeLevel1::ALG_LEVEL1_PIPELINE, "pipeline"},
     229              :     {AlgTypeLevel1::ALG_LEVEL1_NHR, "NHR"},         {AlgTypeLevel1::ALG_LEVEL1_NHR_V1, "NHR_V1"},
     230              :     {AlgTypeLevel1::ALG_LEVEL1_AHC, "AHC"},         {AlgTypeLevel1::ALG_LEVEL1_AHC_BROKE, "AHC_BROKE"},
     231              :     {AlgTypeLevel1::ALG_LEVEL1_NB, "NB"},           {AlgTypeLevel1::ALG_LEVEL1_RESERVED, "null"},
     232              : };
     233              : 
     234              : const std::map<AlgTypeLevel2, std::string> HCCL_ALGO_LEVEL2_NAME_MAP = {
     235              :     {AlgTypeLevel2::ALG_LEVEL2_WHOLE_RING, "ring"}, {AlgTypeLevel2::ALG_LEVEL2_HD, "H-D"},
     236              :     {AlgTypeLevel2::ALG_LEVEL2_RING, "ring"},       {AlgTypeLevel2::ALG_LEVEL2_NHR, "NHR"},
     237              :     {AlgTypeLevel2::ALG_LEVEL2_NB, "NB"},           {AlgTypeLevel2::ALG_LEVEL2_PIPELINE, "pipeline"},
     238              :     {AlgTypeLevel2::ALG_LEVEL2_RESERVED, "null"},
     239              : };
     240              : 
     241              : const std::map<AlgTypeLevel0, std::string> HCCL_ALGO_LEVEL0_MAP = {
     242              :     {AlgTypeLevel0::ALG_LEVEL0_NP_DOUBLE_RING, "RING"}, {AlgTypeLevel0::ALG_LEVEL0_WHOLE_RING, "RING"},
     243              :     {AlgTypeLevel0::ALG_LEVEL0_8P_RING, "RING"},        {AlgTypeLevel0::ALG_LEVEL0_4P_MESH, "MESH"},
     244              :     {AlgTypeLevel0::ALG_LEVEL0_2P_MESH, "MESH"},        {AlgTypeLevel0::ALG_LEVEL0_1P_MESH, "MESH"},
     245              :     {AlgTypeLevel0::ALG_LEVEL0_4P_RING, "RING"},        {AlgTypeLevel0::ALG_LEVEL0_NP_SINGLE_RING, "RING"},
     246              :     {AlgTypeLevel0::ALG_LEVEL0_NP_MESH, "MESH"},        {AlgTypeLevel0::ALG_LEVEL0_NP_HD, "HD"},
     247              :     {AlgTypeLevel0::ALG_LEVEL0_NP_STAR, "STAR"},        {AlgTypeLevel0::ALG_LEVEL0_PAIRWISE, "PAIRWISE"},
     248              :     {AlgTypeLevel0::ALG_LEVEL0_RESERVED, "NA"},
     249              : };
     250              : 
     251              : const std::map<AlgTypeLevel1, std::string> HCCL_ALGO_LEVEL1_MAP = {
     252              :     {AlgTypeLevel1::ALG_LEVEL1_WHOLE_RING, "RING"}, {AlgTypeLevel1::ALG_LEVEL1_HD, "HD"},
     253              :     {AlgTypeLevel1::ALG_LEVEL1_RING, "RING"},       {AlgTypeLevel1::ALG_LEVEL1_PIPELINE, "PIPELINE"},
     254              :     {AlgTypeLevel1::ALG_LEVEL1_NHR, "NHR"},         {AlgTypeLevel1::ALG_LEVEL1_NHR_V1, "NHR_V1"},
     255              :     {AlgTypeLevel1::ALG_LEVEL1_AHC, "AHC"},         {AlgTypeLevel1::ALG_LEVEL1_AHC_BROKE, "AHC_BROKE"},
     256              :     {AlgTypeLevel1::ALG_LEVEL1_NB, "NB"},           {AlgTypeLevel1::ALG_LEVEL1_STAR, "STAR"},
     257              :     {AlgTypeLevel1::ALG_LEVEL1_RESERVED, "NA"},
     258              : };
     259              : 
     260              : const std::map<AlgTypeLevel2, std::string> HCCL_ALGO_LEVEL2_MAP = {
     261              :     {AlgTypeLevel2::ALG_LEVEL2_WHOLE_RING, "RING"}, {AlgTypeLevel2::ALG_LEVEL2_HD, "HD"},
     262              :     {AlgTypeLevel2::ALG_LEVEL2_RING, "RING"},       {AlgTypeLevel2::ALG_LEVEL2_NHR, "NHR"},
     263              :     {AlgTypeLevel2::ALG_LEVEL2_NB, "NB"},           {AlgTypeLevel2::ALG_LEVEL2_PIPELINE, "PIPELINE"},
     264              :     {AlgTypeLevel2::ALG_LEVEL2_RESERVED, "NA"},
     265              : };
     266              : 
     267           13 : inline std::string TransferAlgType(AlgType algType)
     268              : {
     269           13 :     std::string algTypeStr;
     270           13 :     auto level0Iter = HCCL_ALGO_LEVEL0_MAP.find(algType.algoLevel0);
     271           13 :     auto level1Iter = HCCL_ALGO_LEVEL1_MAP.find(algType.algoLevel1);
     272           13 :     auto level2Iter = HCCL_ALGO_LEVEL2_MAP.find(algType.algoLevel2);
     273           26 :     if (level0Iter == HCCL_ALGO_LEVEL0_MAP.end() || level1Iter == HCCL_ALGO_LEVEL1_MAP.end()
     274           26 :         || level2Iter == HCCL_ALGO_LEVEL2_MAP.end()) {
     275            0 :         algTypeStr = "not found";
     276            0 :         HCCL_WARNING("No matching algLevel0 or algLevel1 or algLevel2 is found.");
     277              :     } else {
     278           13 :         algTypeStr.append(static_cast<std::string>(level0Iter->second))
     279           13 :             .append("-")
     280           26 :             .append(static_cast<std::string>(level1Iter->second))
     281           13 :             .append("-")
     282           13 :             .append(static_cast<std::string>(level2Iter->second));
     283           13 :         HCCL_INFO("The algtype for profiling is [%s]", algTypeStr.c_str());
     284              :     }
     285              : 
     286           13 :     return algTypeStr;
     287            0 : }
     288              : 
     289            0 : inline bool TransferStrToAlgType(const std::string& algTypeStr, AlgType& algType)
     290              : {
     291              :     // 分割字符串
     292            0 :     std::vector<std::string> parts;
     293            0 :     std::stringstream ss(algTypeStr);
     294            0 :     std::string part;
     295            0 :     constexpr u32 algTypeLevelNum = 3;
     296              : 
     297            0 :     while (std::getline(ss, part, '-')) {
     298            0 :         parts.push_back(part);
     299              :     }
     300              : 
     301              :     // 检查格式
     302            0 :     if (parts.size() != algTypeLevelNum) {
     303            0 :         HCCL_ERROR("Invalid algType string format: %s", algTypeStr.c_str());
     304            0 :         return false;
     305              :     }
     306            0 :     int level0Val = std::stoi(parts[0]);
     307            0 :     int level1Val = std::stoi(parts[1]);
     308            0 :     int level2Val = std::stoi(parts[2]);
     309            0 :     if (level0Val >= static_cast<int>(AlgTypeLevel0::ALG_LEVEL0_RESERVED) || level0Val < 0
     310            0 :         || level1Val >= static_cast<int>(AlgTypeLevel1::ALG_LEVEL1_RESERVED) || level1Val < 0
     311            0 :         || level2Val >= static_cast<int>(AlgTypeLevel2::ALG_LEVEL2_RESERVED) || level2Val < 0) {
     312            0 :         HCCL_ERROR("Invalid algType string format: %s", algTypeStr.c_str());
     313            0 :         return false;
     314              :     }
     315            0 :     algType.algoLevel0 = static_cast<AlgTypeLevel0>(level0Val);
     316            0 :     algType.algoLevel1 = static_cast<AlgTypeLevel1>(level1Val);
     317            0 :     algType.algoLevel2 = static_cast<AlgTypeLevel2>(level2Val);
     318              : 
     319            0 :     HCCL_INFO("Successfully parsed algType from string: %s", algTypeStr.c_str());
     320            0 :     return true;
     321            0 : }
     322              : 
     323              : } // namespace hccl
     324              : 
     325              : enum class TopoType {
     326              :     TOPO_TYPE_COMMON = 0,         // 普通拓扑类型 ,default单层拓扑使用
     327              :     TOPO_TYPE_8P_RING = 1,        // 特殊场景, 服务器内8 rank组成一个ring,4个逻辑环
     328              :     TOPO_TYPE_4P_MESH = 2,        // 特殊场景, 服务器内4 rank组成MESH
     329              :     TOPO_TYPE_2P_MESH = 3,        // 特殊场景, 服务器内2 rank组成MESH。仅用于测试和自验证
     330              :     TOPO_TYPE_1P_MESH = 4,        // 特殊场景, 服务器内1 rank组成MESH。仅用于测试和自验证
     331              :     TOPO_TYPE_4P_RING = 5,        // 特殊场景,服务器内4 rank组成ring
     332              :     TOPO_TYPE_NP_SINGLE_RING = 6, // 特殊场景, 服务器内n rank组成单 ring。目前仅用于标卡
     333              :     TOPO_TYPE_8P_MESH = 7,        // 特殊场景, 服务器内8 rank通过RDMA组成MESH
     334              :     TOPO_TYPE_NP_MESH = 8,        // 特殊场景, 服务器内3~8p rank组成MESH
     335              :     TOPO_TYPE_NP_DOUBLE_RING = 9, // 特殊场景, 910_93场景
     336              :     TOPO_TYPE_HETEROG = 10,
     337              :     TOPO_TYPE_ES_MESH = 11,
     338              :     TOPO_TYPE_RESERVED
     339              : };
     340              : 
     341              : #endif /* COMMON_H */
        

Generated by: LCOV version 2.0-1