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

Generated by: LCOV version 2.0-1