LCOV - code coverage report
Current view: top level - legacy/ascend910/platform/common - externalinput.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 67.2 % 983 661
Test Date: 2026-08-18 17:47:01 Functions: 84.3 % 108 91

            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              : #include <iostream>
      12              : #include <fstream>
      13              : #include <algorithm>
      14              : #include <adapter_rts.h>
      15              : #include <thread>
      16              : #include <mutex>
      17              : #include <unistd.h>
      18              : #include <regex>
      19              : #include <cmath>
      20              : #include "sal.h"
      21              : #include "adapter_error_manager.h"
      22              : #include "externalinput_pub.h"
      23              : #include "mmpa_api.h"
      24              : #include "config_plf_log.h"
      25              : #include "device_capacity.h"
      26              : #include "externalinput.h"
      27              : 
      28              : using namespace std;
      29              : using namespace hccl;
      30              : 
      31              : #define GET_ENV(IdName)                                                   \
      32              :     ({                                                                    \
      33              :         char* mmSysGetEnvValue = nullptr;                                 \
      34              :         MM_SYS_GET_ENV(IdName, mmSysGetEnvValue);                         \
      35              :         (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString"; \
      36              :     })
      37              : 
      38              : static std::mutex g_externalInputMutex;
      39              : static ExternalInput g_externalInput; //  外部输入参数 (环境变量,配置文件)
      40              : static thread_local bool g_ifProf = true;
      41              : constexpr u32 HCCL_QPS_PER_CONNECTION_MAX = 32; // HCCL 默认的rank 间QP个数(仅单算子下生效)
      42              : 
      43          424 : HcclResult InitExternalInput()
      44              : {
      45          424 :     std::lock_guard<std::mutex> lock(g_externalInputMutex);
      46          424 :     if (g_externalInput.initialized) {
      47           66 :         return HCCL_SUCCESS;
      48              :     }
      49              :     //  初始化环境变量参数
      50          358 :     CHK_RET(InitEnvVarParam());
      51              : 
      52          358 :     g_externalInput.initialized = true;
      53              : 
      54          358 :     return HCCL_SUCCESS;
      55          424 : }
      56              : 
      57          499 : HcclResult InitExternalInputHeterog()
      58              : {
      59              :     // 解析server间通信协议
      60          499 :     g_externalInput.remoteIsHdc = true;
      61          499 :     g_externalInput.protocolType = ProtocolType::RDMA;
      62          499 :     HCCL_INFO(
      63              :         "Protocol[%d], remoteIsHdc[%d]", static_cast<s32>(g_externalInput.protocolType),
      64              :         g_externalInput.remoteIsHdc ? 1 : 0);
      65          499 :     return HCCL_SUCCESS;
      66              : }
      67              : 
      68            0 : void SetExternalInputProtocolType(ProtocolType prot) { g_externalInput.protocolType = prot; }
      69              : 
      70         1130 : HcclResult ResetInitState()
      71              : {
      72         1130 :     g_externalInput.SetDefaultParams();
      73         1130 :     return HCCL_SUCCESS;
      74              : }
      75              : 
      76          392 : HcclResult InitEnvVarParam()
      77              : {
      78              :     // 解析hccl connect timeout 超时时间
      79          392 :     HcclResult ret = ParseLinkConnTimeOut();
      80          392 :     RPT_ENV_ERR(
      81              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
      82              :         std::vector<std::string>(
      83              :             {GET_ENV(MM_ENV_HCCL_CONNECT_TIMEOUT), "HCCL_CONNECT_TIMEOUT",
      84              :              "a number greater than or equal to 120s and less than or equal to 7200s"}));
      85          392 :     CHK_PRT_RET(
      86              :         ret != HCCL_SUCCESS,
      87              :         HCCL_ERROR(
      88              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse link "
      89              :             "time out failed. errorno[%d]",
      90              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
      91              :         ret);
      92              : 
      93              :     // 解析hccl execute timeout 超时时间
      94              :     // 环境变量的解析在options解析之后, 如果options中配置了hccl execute timeout, 则不解析环境变量中的hccl execute
      95              :     // timeout
      96          392 :     if (g_externalInput.execTimeOutSet != HcclExecTimeoutSet::HCCL_EXEC_TIMEOUT_SET_BY_OPTIONS) {
      97          392 :         ret = ParseExecTimeOut();
      98          392 :         CHK_PRT_RET(
      99              :             ret != HCCL_SUCCESS,
     100              :             HCCL_ERROR(
     101              :                 "[%s][%s]errNo[0x%016llx] In init env variable param, parse execute time out failed. errorno[%d]",
     102              :                 LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     103              :             ret);
     104              :     }
     105              : 
     106              :     // 解析server内通信方式
     107          392 :     ret = ParseIntraLinkType();
     108          784 :     std::string userInput = "PCIE enable: " + std::string(GET_ENV(MM_ENV_HCCL_INTRA_PCIE_ENABLE))
     109         1176 :                             + "or ROCE enable:" + std::string(GET_ENV(MM_ENV_HCCL_INTRA_ROCE_ENABLE));
     110          392 :     RPT_ENV_ERR(
     111              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     112              :         std::vector<std::string>(
     113              :             {userInput, "HCCL_INTRA_PCIE_ENABLE or HCCL_INTRA_ROCE_ENABLE", "0 or 1 (but not both 1)"}));
     114          392 :     CHK_PRT_RET(
     115              :         ret != HCCL_SUCCESS,
     116              :         HCCL_ERROR(
     117              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse intra "
     118              :             "comm type failed. errorno[%d]",
     119              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     120              :         ret);
     121              : 
     122              :     // 解析profiling 配置
     123          392 :     ret = ParseProfilingConfig();
     124          392 :     RPT_ENV_ERR(
     125              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     126              :         std::vector<std::string>({GET_ENV(MM_ENV_PROFILING_MODE), "PROFILING_MODE", "true or false"}));
     127          392 :     CHK_PRT_RET(
     128              :         ret != HCCL_SUCCESS,
     129              :         HCCL_ERROR(
     130              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse profiling "
     131              :             "config failed. errorno[%d]",
     132              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     133              :         ret);
     134              : 
     135              :     // 解析whitelist switch配置
     136          392 :     ret = ParseHcclWhitelistSwitch();
     137          392 :     RPT_ENV_ERR(
     138              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     139              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_WHITELIST_DISABLE), "HCCL_WHITELIST_DISABLE", "0 or 1"}));
     140          392 :     CHK_PRT_RET(
     141              :         ret != HCCL_SUCCESS,
     142              :         HCCL_ERROR(
     143              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse whitelist switch failed. errorno[%d]",
     144              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     145              :         ret);
     146              : 
     147              :     // 解析whitelist file配置
     148          392 :     ret = ParseHcclWhitelistFilePath();
     149          392 :     RPT_ENV_ERR(
     150              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     151              :         std::vector<std::string>(
     152              :             {GET_ENV(MM_ENV_HCCL_WHITELIST_FILE), "HCCL_WHITELIST_FILE",
     153              :              "absolute file path with length less than 4096"}));
     154          392 :     CHK_PRT_RET(
     155              :         ret != HCCL_SUCCESS,
     156              :         HCCL_ERROR(
     157              :             "[%s][%s]errNo[0x%016llx] In init env variable param, "
     158              :             "parse whitelist file failed. errorno[%d]",
     159              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     160              :         ret);
     161              : 
     162              :     // 解析rootinfo IF配置
     163          392 :     ret = ParseHcclIfIp();
     164          392 :     RPT_ENV_ERR(
     165              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     166              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_IF_IP), "HCCL_IF_IP", "\"ip[%ifname]\""}));
     167          392 :     CHK_PRT_RET(
     168              :         ret != HCCL_SUCCESS,
     169              :         HCCL_ERROR(
     170              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse rootInfo network interface failed. "
     171              :             "errorno[%d]",
     172              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     173              :         ret);
     174              : 
     175              :     // 解析Host Socket IfName配置
     176          392 :     ret = ParseHcclSocketIfName();
     177          392 :     RPT_ENV_ERR(
     178              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     179              :         std::vector<std::string>(
     180              :             {GET_ENV(MM_ENV_HCCL_SOCKET_IFNAME), "HCCL_SOCKET_IFNAME", "Format: [=|^=|<interface>[,<interface>...]]"}));
     181          392 :     CHK_PRT_RET(
     182              :         ret != HCCL_SUCCESS,
     183              :         HCCL_ERROR(
     184              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse host interface name failed. errorno[%d]",
     185              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     186              :         ret);
     187              : 
     188          392 :     ret = ParseHcclSocketFamily();
     189          392 :     RPT_ENV_ERR(
     190              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     191              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_SOCKET_FAMILY), "HCCL_SOCKET_FAMILY", "AF_INET or AF_INET6"}));
     192          392 :     CHK_PRT_RET(
     193              :         ret != HCCL_SUCCESS,
     194              :         HCCL_ERROR(
     195              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse hccl socket family config failed. "
     196              :             "errorno[%d]",
     197              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     198              :         ret);
     199              : 
     200              :     // 解析BASE端口
     201          392 :     ret = ParseHcclIfBasePort();
     202          392 :     RPT_ENV_ERR(
     203              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     204              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_IF_BASE_PORT), "HCCL_IF_BASE_PORT", "range[1024,65520]"}));
     205          392 :     CHK_PRT_RET(
     206              :         ret != HCCL_SUCCESS,
     207              :         HCCL_ERROR(
     208              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse IF base port config failed. errorno[%d]",
     209              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     210              :         ret);
     211              : 
     212              :     // 解析Cann版本
     213              :     // CANN版本的校验不影响HCCL业务,所以解析过程中不返回错误
     214          392 :     (void)ParseCannVersion();
     215              : 
     216              :     // 解析RDMATrafficClass
     217          392 :     ret = ParseRDMATrafficClass();
     218          392 :     RPT_ENV_ERR(
     219              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     220              :         std::vector<std::string>(
     221              :             {GET_ENV(MM_ENV_HCCL_RDMA_TC), "HCCL_RDMA_TC", "range[0, 255], Must be a multiple of 4"}));
     222          392 :     CHK_PRT_RET(
     223              :         ret != HCCL_SUCCESS,
     224              :         HCCL_ERROR(
     225              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_RDMA_TC failed. errorno[%d]",
     226              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     227              :         ret);
     228              : 
     229              :     // 解析RDMAServerLevel
     230          392 :     ret = ParseRDMAServerLevel();
     231          392 :     RPT_ENV_ERR(
     232              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     233              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_RDMA_SL), "HCCL_RDMA_SL", "range[0, 7]"}));
     234          392 :     CHK_PRT_RET(
     235              :         ret != HCCL_SUCCESS,
     236              :         HCCL_ERROR(
     237              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_RDMA_SL failed. errorno[%d]",
     238              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     239              :         ret);
     240              : 
     241              :     // 解析RDMATimeOut
     242          392 :     std::pair<u32, u32> rdmaTimeOutRange;
     243          392 :     ret = ParseRDMATimeOut(rdmaTimeOutRange);
     244              :     std::string vaildRange
     245          392 :         = "range[" + std::to_string(rdmaTimeOutRange.first) + " ," + std::to_string(rdmaTimeOutRange.second) + "]";
     246          392 :     RPT_ENV_ERR(
     247              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     248              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_RDMA_TIMEOUT), "HCCL_RDMA_TIMEOUT", vaildRange}));
     249          392 :     CHK_PRT_RET(
     250              :         ret != HCCL_SUCCESS,
     251              :         HCCL_ERROR(
     252              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_RDMA_TIMEOUT failed. errorno[%d]",
     253              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     254              :         ret);
     255              : 
     256              :     // 解析RDMARetryCnt
     257          392 :     ret = ParseRDMARetryCnt();
     258          392 :     RPT_ENV_ERR(
     259              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     260              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_RDMA_RETRY_CNT), "HCCL_RDMA_RETRY_CNT", "range[1, 7]"}));
     261          392 :     CHK_PRT_RET(
     262              :         ret != HCCL_SUCCESS,
     263              :         HCCL_ERROR(
     264              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_RDMA_RETRY_CNT failed. errorno[%d]",
     265              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     266              :         ret);
     267              : 
     268              :     // 解析cclbufersize
     269          392 :     ret = ParseCclBufferSize();
     270          392 :     RPT_ENV_ERR(
     271              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     272              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_BUFFSIZE), "HCCL_BUFFSIZE", "equal to or greater than 1(MB)"}));
     273          392 :     CHK_PRT_RET(
     274              :         ret != HCCL_SUCCESS,
     275              :         HCCL_ERROR(
     276              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_BUFFSIZE failed. errorno[%d]",
     277              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     278              :         ret);
     279              : 
     280              :     // 解析hcclDeterministic,是否为确定性计算
     281          392 :     ret = ParseDeterministic();
     282          392 :     RPT_ENV_ERR(
     283              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     284              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_DETERMINISTIC), "HCCL_DETERMINISTIC", "true, false or strict"}));
     285          392 :     CHK_PRT_RET(
     286              :         ret != HCCL_SUCCESS,
     287              :         HCCL_ERROR(
     288              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_DETERMINISTIC failed. errorno[%d]",
     289              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     290              :         ret);
     291              : 
     292              :     // 解析ffts+模式(子任务粒度)下task_exception_handler开关
     293          392 :     ret = ParseTaskExceptionSwitch();
     294          392 :     RPT_ENV_ERR(
     295              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     296              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_DIAGNOSE_ENABLE), "HCCL_DIAGNOSE_ENABLE", "0 or 1"}));
     297          392 :     CHK_PRT_RET(
     298              :         ret != HCCL_SUCCESS,
     299              :         HCCL_ERROR(
     300              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_DIAGNOSE_ENABLE failed. "
     301              :             "errorno[%d]",
     302              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     303              :         ret);
     304              : 
     305              :     // 解析Entry日志开关
     306          392 :     ret = ParseEntryLogEnable();
     307          392 :     RPT_ENV_ERR(
     308              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     309              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_ENTRY_LOG_ENABLE), "HCCL_ENTRY_LOG_ENABLE", "0 or 1"}));
     310          392 :     CHK_PRT_RET(
     311              :         ret != HCCL_SUCCESS,
     312              :         HCCL_ERROR(
     313              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_ENTRY_LOG_ENABLE failed. "
     314              :             "errorno[%d]",
     315              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     316              :         ret);
     317              : 
     318              :     // 解析超节点内节点间链路选择开关
     319          392 :     ret = ParseInterLinkType();
     320          392 :     RPT_ENV_ERR(
     321              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     322              :         std::vector<std::string>(
     323              :             {GET_ENV(MM_ENV_HCCL_INTER_HCCS_DISABLE), "HCCL_INTER_HCCS_DISABLE", "true or false"}));
     324          392 :     CHK_PRT_RET(
     325              :         ret != HCCL_SUCCESS,
     326              :         HCCL_ERROR(
     327              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_INTER_HCCS_DISABLE failed. "
     328              :             "errorno[%d]",
     329              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     330              :         ret);
     331              : 
     332          392 :     ret = ParseOpExpansion();
     333          392 :     RPT_ENV_ERR(
     334              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     335              :         std::vector<std::string>(
     336              :             {GET_ENV(MM_ENV_HCCL_OP_EXPANSION_MODE), "HCCL_OP_EXPANSION_MODE",
     337              :              "Atlas A3: AI_CPU | AIV; Atlas A2 AIV | HOST | HOST_TS; Atlas 300I AI_CPU | HOST"}));
     338          392 :     CHK_PRT_RET(
     339              :         ret != HCCL_SUCCESS,
     340              :         HCCL_ERROR(
     341              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_OP_EXPANSION_MODE failed. "
     342              :             "errorno[%d]",
     343              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     344              :         ret);
     345              : 
     346              :     // 解析rank 间的QP个数
     347          392 :     ret = ParseRdmaQpsPerConnection();
     348          392 :     RPT_ENV_ERR(
     349              :         ret != HCCL_SUCCESS, "", std::vector<std::string>({"value", "env", "expect"}),
     350              :         std::vector<std::string>(
     351              :             {GET_ENV(MM_ENV_HCCL_RDMA_QPS_PER_CONNECTION), "HCCL_RDMA_QPS_PER_CONNECTION",
     352              :              "The allowed value range is [1, 32], "
     353              :              "but the recommended value range is [1, 8]."}));
     354          392 :     CHK_PRT_RET(
     355              :         ret != HCCL_SUCCESS,
     356              :         HCCL_ERROR(
     357              :             "[%s][%s]errNo[0x%016llx] In init env variable param, "
     358              :             "parse HCCL_RDMA_QPS_PER_CONNECTION(range[1,32]) failed. errorno[%d]",
     359              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     360              :         ret);
     361              : 
     362              :     // 解析rank 间多QP切分门限
     363          392 :     ret = ParseMultiQpThreshold();
     364          392 :     RPT_ENV_ERR(
     365              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     366              :         std::vector<std::string>(
     367              :             {GET_ENV(MM_ENV_HCCL_MULTI_QP_THRESHOLD), "HCCL_MULTI_QP_THRESHOLD", "larger than 0, less than 8193(KB)"}));
     368          392 :     CHK_PRT_RET(
     369              :         ret != HCCL_SUCCESS,
     370              :         HCCL_ERROR(
     371              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse "
     372              :             "HCCL_MULTI_QP_THRESHOLD(range[1,8192]) failed. errorno[%d]",
     373              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     374              :         ret);
     375              : 
     376              : #ifndef CCL_KERNEL_AICPU
     377              :     // 解析重执行设置
     378          392 :     ret = ParseRetryEnable();
     379          392 :     RPT_ENV_ERR(
     380              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     381              :         std::vector<std::string>({GET_ENV(MM_ENV_HCCL_OP_RETRY_ENABLE), "HCCL_OP_RETRY_ENABLE", "0 or 1"}));
     382          392 :     CHK_PRT_RET(
     383              :         ret != HCCL_SUCCESS,
     384              :         HCCL_ERROR(
     385              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_OP_RETRY_ENABLE failed. "
     386              :             "errorno[%d]",
     387              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     388              :         ret);
     389              : #endif
     390              : 
     391              : #ifndef CCL_KERNEL_AICPU
     392              :     // 解析重执行最大尝试次数 重执行间隔时间 首次重执行等待时间 */
     393          392 :     ret = ParseRetryParams();
     394          392 :     RPT_ENV_ERR(
     395              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     396              :         std::vector<std::string>(
     397              :             {GET_ENV(MM_ENV_HCCL_OP_RETRY_PARAMS), "HCCL_OP_RETRY_PARAMS",
     398              :              "format must be: \"MaxCnt:cnt,HoldTime:time,IntervalTime:time\"."
     399              :              "cnt range is [1, 10], time range is [0, 60000]"}));
     400          392 :     CHK_PRT_RET(
     401              :         ret != HCCL_SUCCESS,
     402              :         HCCL_ERROR(
     403              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_OP_RETRY_PARAMS failed. "
     404              :             "errorno[%d]",
     405              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     406              :         ret);
     407              : #endif
     408              : 
     409          392 :     ret = ParseLogicSuperPodId();
     410          392 :     RPT_ENV_ERR(
     411              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     412              :         std::vector<std::string>(
     413              :             {GET_ENV(MM_ENV_HCCL_LOGIC_SUPERPOD_ID), "HCCL_LOGIC_SUPERPOD_ID", "length must be less than 128"}));
     414          392 :     CHK_PRT_RET(
     415              :         ret != HCCL_SUCCESS,
     416              :         HCCL_ERROR(
     417              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_LOGIC_SUPERPOD_ID failed. "
     418              :             "errorno[%d]",
     419              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     420              :         ret);
     421              : 
     422          392 :     ret = ParseRdmaFastPost();
     423          392 :     RPT_ENV_ERR(
     424              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     425              :         std::vector<std::string>(
     426              :             {GET_ENV(MM_ENV_HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT), "HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT",
     427              :              "true or false"}));
     428          392 :     CHK_PRT_RET(
     429              :         ret != HCCL_SUCCESS,
     430              :         HCCL_ERROR(
     431              :             "[%s][%s]errNo[0x%016llx] In init env variable param, parse "
     432              :             "HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT failed. errorno[%d]",
     433              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     434              :         ret);
     435              : 
     436              :     // 解析多QP源端口号配置文件路径
     437          392 :     ret = ParseMultiQpSrcPortConfigPath();
     438          392 :     RPT_ENV_ERR(
     439              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     440              :         std::vector<std::string>(
     441              :             {GET_ENV(MM_ENV_HCCL_RDMA_QP_PORT_CONFIG_PATH), "HCCL_RDMA_QP_PORT_CONFIG_PATH",
     442              :              "a valid existing file path"}));
     443          392 :     CHK_PRT_RET(
     444              :         ret != HCCL_SUCCESS,
     445              :         HCCL_ERROR(
     446              :             "[%s][%s]errNo[0x%016llx] In init env variable param, "
     447              :             "parse MultiQpSrcPortConfigPath failed. errorno[%d]",
     448              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     449              :         ret);
     450              : 
     451              :     // 解析ParseDebugConfig
     452          392 :     ret = ParseDebugConfig();
     453          392 :     char* env = nullptr; // 环境变量值
     454          392 :     MM_SYS_GET_ENV(MM_ENV_HCCL_DEBUG_CONFIG, env);
     455          917 :     std::string envValue = env ? std::string(env) : "null";
     456          392 :     RPT_ENV_ERR(
     457              :         ret != HCCL_SUCCESS, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     458              :         std::vector<std::string>({envValue, "HCCL_DEBUG_CONFIG", "ALG,TASK,RESOURCE(optionally prefixed with'^')"}));
     459          392 :     CHK_PRT_RET(
     460              :         ret != HCCL_SUCCESS,
     461              :         HCCL_ERROR(
     462              :             "[%s][%s]errNo[0x%016llx] In init env variable param, "
     463              :             "parse HCCL_DEBUG_CONFIG failed. errorno[%d]",
     464              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCCL_ERROR_CODE(ret), ret),
     465              :         ret);
     466              : 
     467          392 :     return HCCL_SUCCESS;
     468          392 : }
     469              : 
     470          392 : HcclResult ParseRdmaFastPost()
     471              : {
     472          392 :     std::string rdmaFastPostEnv = GET_ENV(MM_ENV_HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT);
     473          392 :     if (rdmaFastPostEnv == "EmptyString") {
     474          392 :         HCCL_RUN_INFO(
     475              :             "[HCCL_ENV] HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT set by default to [%s], rdmaFastPost is [%d]",
     476              :             rdmaFastPostEnv.c_str(), g_externalInput.rdmaFastPost);
     477          392 :         return HCCL_SUCCESS;
     478              :     }
     479            0 :     std::transform(rdmaFastPostEnv.begin(), rdmaFastPostEnv.end(), rdmaFastPostEnv.begin(), ::toupper);
     480            0 :     if (rdmaFastPostEnv == "TRUE") {
     481            0 :         g_externalInput.rdmaFastPost = true;
     482            0 :     } else if (rdmaFastPostEnv == "FALSE") {
     483            0 :         g_externalInput.rdmaFastPost = false;
     484              :     } else {
     485            0 :         HCCL_ERROR(
     486              :             "HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT is set to [%s], which is incorrect. Please check",
     487              :             rdmaFastPostEnv.c_str());
     488            0 :         return HCCL_E_PARA;
     489              :     }
     490            0 :     HCCL_RUN_INFO(
     491              :         "[HCCL_ENV] HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT set by environment to [%s], rdmaFastPost is [%d].",
     492              :         rdmaFastPostEnv.c_str(), g_externalInput.rdmaFastPost);
     493            0 :     return HCCL_SUCCESS;
     494          392 : }
     495              : 
     496            3 : bool IsValidExecTimeOutMs(const std::string& execTimeOutStr)
     497              : {
     498              :     // 校验配置值为数字格式,小数点最多2位
     499            3 :     std::regex validFormat(R"(^\d+(\.\d{1,2})?$)");
     500            3 :     if (!std::regex_match(execTimeOutStr, validFormat)) {
     501            0 :         return false;
     502              :     }
     503              : 
     504            3 :     return true;
     505            3 : }
     506              : 
     507          392 : HcclResult ParseExecTimeOut()
     508              : {
     509          392 :     std::string execTimeOutEnv = GET_ENV(MM_ENV_HCCL_EXEC_TIMEOUT);
     510          392 :     if (execTimeOutEnv == "EmptyString") {
     511          391 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_EXEC_TIMEOUT set by default to [%d]s", NOTIFY_DEFAULT_WAIT_TIME);
     512          391 :         return HCCL_SUCCESS;
     513              :     }
     514              : 
     515              :     // 校验环境变量长度
     516            1 :     bool isEnvLenValid = CheckEnvLen(execTimeOutEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     517            1 :     CHK_PRT_RET(
     518              :         !isEnvLenValid,
     519              :         HCCL_ERROR(
     520              :             "[Parse][ExecuteTimeOut]errNo[0x%016llx] Invalid ExecuteTimeOut env len, len is bigger than "
     521              :             "[%u]. errorno[%d]",
     522              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     523              :         HCCL_E_PARA);
     524              : 
     525            1 :     CHK_RET(SetHccLExecTimeOut(execTimeOutEnv.c_str(), HcclExecTimeoutSet::HCCL_EXEC_TIMEOUT_SET_BY_ENV));
     526              : 
     527            1 :     return HCCL_SUCCESS;
     528          392 : }
     529              : 
     530          392 : HcclResult ParseLinkConnTimeOut()
     531              : {
     532          392 :     std::string timeOutEnv = GET_ENV(MM_ENV_HCCL_CONNECT_TIMEOUT);
     533          392 :     s32 timeOut = HCCL_LINK_TIME_OUT_S;
     534              : 
     535          392 :     if (timeOutEnv != "EmptyString") {
     536              :         // 校验环境变量长度
     537            0 :         bool isEnvLenValid = CheckEnvLen(timeOutEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     538            0 :         CHK_PRT_RET(
     539              :             !isEnvLenValid,
     540              :             HCCL_ERROR(
     541              :                 "[Parse][LinkConnTimeOut]errNo[0x%016llx] Invalid LinkConnTimeOut env len, len is bigger than "
     542              :                 "[%u]. errorno[%d]",
     543              :                 HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     544              :             HCCL_E_PARA);
     545              : 
     546            0 :         CHK_RET(IsAllDigit(timeOutEnv.c_str()));
     547            0 :         HcclResult ret = SalStrToInt(timeOutEnv, HCCL_BASE_DECIMAL, timeOut);
     548              :         // 若转换出错或者设置的超时时间小于2分钟或大于2小时,报错并设为默认值
     549            0 :         if (ret != HCCL_SUCCESS || (timeOut < HCCL_MIN_LINK_TIME_OUT_S) || (timeOut > HCCL_MAX_LINK_TIME_OUT_S)) {
     550            0 :             HCCL_ERROR(
     551              :                 "[Parse][LinkConnTimeOut]environmental variable HCCL_CONNECT_TIMEOUT error, errNo[0x%016llx]"
     552              :                 "timeOutEnv[%ss] timeRange[%ds,%ds]",
     553              :                 HCOM_ERROR_CODE(ret), timeOutEnv.c_str(), HCCL_MIN_LINK_TIME_OUT_S, HCCL_MAX_LINK_TIME_OUT_S);
     554            0 :             g_externalInput.linkTimeOut = HCCL_LINK_TIME_OUT_S;
     555            0 :             return HCCL_E_PARA;
     556              :         }
     557            0 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_CONNECT_TIMEOUT set by environment to [%d]s", timeOut);
     558              :     } else {
     559          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_CONNECT_TIMEOUT set by default to [%d]s", timeOut);
     560              :     }
     561              : 
     562          392 :     g_externalInput.linkTimeOut = timeOut;
     563          392 :     return HCCL_SUCCESS;
     564          392 : }
     565              : 
     566            1 : HcclResult GetIntraLinkTypeDigit(std::string& intraCommStr, u32& intraCommDig)
     567              : {
     568            1 :     CHK_RET(IsAllDigit(intraCommStr.c_str()));
     569            2 :     CHK_RET(SalStrToULong(intraCommStr.c_str(), HCCL_BASE_DECIMAL, intraCommDig));
     570              : 
     571            1 :     if ((intraCommDig != 0) && (intraCommDig != 1)) { // 判断转换后的数字是否为0或1
     572            0 :         HCCL_ERROR("[Get][IntraLinkTypeDigit]environmental digit variable error, intraCommDig[%u]", intraCommDig);
     573            0 :         return HCCL_E_PARA;
     574              :     }
     575            1 :     return HCCL_SUCCESS;
     576              : }
     577              : 
     578          392 : HcclResult ParseDeterministic()
     579              : {
     580          392 :     std::string hcclDeterministicEnv = GET_ENV(MM_ENV_HCCL_DETERMINISTIC);
     581          392 :     if (hcclDeterministicEnv == "EmptyString") {
     582          380 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_DETERMINISTIC set by default to [false]");
     583          380 :         return HCCL_SUCCESS;
     584              :     }
     585              : 
     586           12 :     std::transform(hcclDeterministicEnv.begin(), hcclDeterministicEnv.end(), hcclDeterministicEnv.begin(), ::toupper);
     587           12 :     if (hcclDeterministicEnv != "STRICT" && hcclDeterministicEnv != "TRUE" && hcclDeterministicEnv != "FALSE") {
     588            0 :         HCCL_ERROR("HCCL_DETERMINISTIC is set to [%s], which is incorrect. Please check", hcclDeterministicEnv.c_str());
     589            0 :         return HCCL_E_PARA;
     590              :     }
     591           12 :     if (hcclDeterministicEnv == "STRICT") {
     592              :         // 规约保序场景(严格的确定性计算,在确定性的基础上强保证规约顺序一致)
     593              :         DevType deviceType;
     594            0 :         CHK_RET(hrtGetDeviceType(deviceType));
     595            0 :         if (deviceType != DevType::DEV_TYPE_910B && deviceType != DevType::DEV_TYPE_910_93) {
     596              :             // 规约保序仅支持A2 A3场景
     597            0 :             HCCL_ERROR(
     598              :                 "HCCL_DETERMINISTIC is set to [%s], Reduce order preservation is not supported for "
     599              :                 "deviceType[%d], please check",
     600              :                 hcclDeterministicEnv.c_str(), deviceType);
     601            0 :             return HCCL_E_NOT_SUPPORT;
     602              :         }
     603            0 :         g_externalInput.hcclDeterministic = DETERMINISTIC_STRICT;
     604           12 :     } else if (hcclDeterministicEnv == "TRUE") {
     605              :         // 确定性计算场景(不保证规约保序)
     606           12 :         g_externalInput.hcclDeterministic = DETERMINISTIC_ENABLE;
     607              :     } else {
     608            0 :         g_externalInput.hcclDeterministic = DETERMINISTIC_DISABLE;
     609              :     }
     610           12 :     HCCL_RUN_INFO(
     611              :         "[HCCL_ENV] HCCL_DETERMINISTIC set by environment to [%s], hcclDeterministic[%u]", hcclDeterministicEnv.c_str(),
     612              :         g_externalInput.hcclDeterministic);
     613           12 :     return HCCL_SUCCESS;
     614          392 : }
     615              : 
     616          392 : HcclResult ParseIntraLinkType()
     617              : {
     618          784 :     std::string intraPcieEnv = GET_ENV(MM_ENV_HCCL_INTRA_PCIE_ENABLE);
     619          392 :     std::string intraRoceEnv = GET_ENV(MM_ENV_HCCL_INTRA_ROCE_ENABLE);
     620              : 
     621          392 :     u32 intraPcie = 1; // 保存pcie环境变量的解析数字
     622          392 :     u32 intraRoce = 0; // 保存roce环境变量的解析数字
     623              : 
     624              :     // 两个通信域环境变量均未设置,默认走pcie
     625          392 :     if (intraPcieEnv == "EmptyString" && intraRoceEnv == "EmptyString") {
     626          391 :         HCCL_RUN_INFO(
     627              :             "[HCCL_ENV] HCCL_INTRA_PCIE_ENABLE set by default to [%u], HCCL_INTRA_ROCE_ENABLE set by default to [%u]",
     628              :             intraPcie, intraRoce);
     629          391 :         return HCCL_SUCCESS;
     630              :     }
     631              : 
     632            1 :     if (intraPcieEnv != "EmptyString") { // 解析HCCL_INTRA_PCIE_ENABLE为数字
     633              :         // 校验环境变量长度
     634            0 :         bool isEnvLenValid = CheckEnvLen(intraPcieEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     635            0 :         CHK_PRT_RET(
     636              :             !isEnvLenValid,
     637              :             HCCL_ERROR(
     638              :                 "[Parse][IntraLinkType]errNo[0x%016llx] Invalid INTRA_PCIE_ENABLE env len, len is bigger than "
     639              :                 "[%u]. errorno[%d]",
     640              :                 HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     641              :             HCCL_E_PARA);
     642            0 :         std::string intraPcieStr(intraPcieEnv);
     643            0 :         CHK_RET(GetIntraLinkTypeDigit(intraPcieStr, intraPcie));
     644            0 :     }
     645              : 
     646            1 :     if (intraRoceEnv != "EmptyString") { // 解析HCCL_INTRA_ROCE_ENABLE为数字
     647              :         // 校验环境变量长度
     648            1 :         bool isEnvLenValid = CheckEnvLen(intraRoceEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     649            1 :         CHK_PRT_RET(
     650              :             !isEnvLenValid,
     651              :             HCCL_ERROR(
     652              :                 "[Parse][IntraLinkType]errNo[0x%016llx] Invalid INTRA_ROCE_ENABLE env len, len is bigger than "
     653              :                 "[%u]. errorno[%d]",
     654              :                 HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     655              :             HCCL_E_PARA);
     656            1 :         std::string intraRoceStr(intraRoceEnv);
     657            1 :         CHK_RET(GetIntraLinkTypeDigit(intraRoceStr, intraRoce));
     658            1 :     }
     659              : 
     660              :     // 只配置了roce的环境变量
     661            1 :     if (intraPcieEnv == "EmptyString" && intraRoceEnv != "EmptyString") {
     662            1 :         if (intraRoce == 0) { // roce环境变量值为0,报错
     663            0 :             HCCL_ERROR("[Parse][IntraLinkType]only set HCCL_INTRA_ROCE_ENABLE, and the val is zero, pls set "
     664              :                        "HCCL_INTRA_PCIE_ENABLE");
     665            0 :             return HCCL_E_PARA;
     666              :         } else { // roce环境变量值为1,走roce
     667            1 :             intraPcie = 0;
     668              :         }
     669            1 :         HCCL_RUN_INFO(
     670              :             "[HCCL_ENV] HCCL_INTRA_PCIE_ENABLE set by environment to [%u], "
     671              :             "HCCL_INTRA_ROCE_ENABLE set by environment to [%u]",
     672              :             intraPcie, intraRoce);
     673              :     }
     674              : 
     675              :     // 只配置了pcie的环境变量
     676            1 :     if (intraPcieEnv != "EmptyString" && intraRoceEnv == "EmptyString") {
     677            0 :         if (intraPcie == 0) { // pcie环境变量值为0,报错
     678            0 :             HCCL_ERROR("[Parse][IntraLinkType]only set HCCL_INTRA_PCIE_ENABLE, and the val is zero, pls set "
     679              :                        "HCCL_INTRA_ROCE_ENABLE");
     680            0 :             return HCCL_E_PARA;
     681              :         }
     682            0 :         HCCL_RUN_INFO(
     683              :             "[HCCL_ENV] HCCL_INTRA_PCIE_ENABLE set by environment to [%u], "
     684              :             "HCCL_INTRA_ROCE_ENABLE set by default to [%u]",
     685              :             intraPcie, intraRoce);
     686              :     }
     687              : 
     688              :     // pcie和roce环境变量同时配置且不相等
     689            1 :     if (intraPcieEnv != "EmptyString" && intraRoceEnv != "EmptyString") {
     690            0 :         if ((intraPcie == 0 && intraRoce == 1) || (intraPcie == 1 && intraRoce == 0)) {
     691            0 :             HCCL_RUN_INFO(
     692              :                 "[HCCL_ENV] HCCL_INTRA_PCIE_ENABLE set by environment to [%u], "
     693              :                 "HCCL_INTRA_ROCE_ENABLE set by environment to [%u]",
     694              :                 intraPcie, intraRoce);
     695              :         }
     696              :     }
     697              : 
     698              :     // pcie和roce环境变量同时配置且相等
     699            1 :     if (!(intraPcie ^ intraRoce)) {
     700            0 :         if (intraPcie == 1) { // 同时为1,暂不支持,报错
     701            0 :             HCCL_ERROR(
     702              :                 "[Parse][IntraLinkType] Enabling intra Pcie and intra Roce at the same time is not supported now.");
     703            0 :             return HCCL_E_PARA;
     704              :         } else { // 同时为0,走pcie
     705            0 :             HCCL_WARNING("Pcie and Roce Env both set to zero at the same time, intra comm is default Pcie");
     706            0 :             intraPcie = 1;
     707              :         }
     708            0 :         HCCL_RUN_INFO(
     709              :             "[HCCL_ENV] HCCL_INTRA_PCIE_ENABLE set by environment to [%u], "
     710              :             "HCCL_INTRA_ROCE_ENABLE set by environment to [%u]",
     711              :             intraPcie, intraRoce);
     712              :     }
     713              : 
     714            1 :     g_externalInput.intraRoceSwitch = intraRoce;
     715            1 :     return HCCL_SUCCESS;
     716          392 : }
     717          392 : HcclResult ParseProfilingConfig()
     718              : {
     719          392 :     g_externalInput.profilingMode = false;
     720          392 :     g_externalInput.profilingOption = "";
     721          392 :     std::string profilingEnv = GET_ENV(MM_ENV_PROFILING_MODE);
     722          392 :     CHK_PRT_RET(
     723              :         profilingEnv == "EmptyString",
     724              :         HCCL_RUN_INFO(
     725              :             "[HCCL_ENV] environmental variable PROFILING_MODE and GE profiling option is not set, default: false"),
     726              :         HCCL_SUCCESS);
     727            5 :     HCCL_DEBUG("PROFILING_MODE[%s] is set", profilingEnv.c_str());
     728            5 :     CHK_PRT_RET(
     729              :         profilingEnv.compare("true") != 0, HCCL_INFO("environmental variable PROFILING_MODE = false"), HCCL_SUCCESS);
     730            0 :     g_externalInput.profilingMode = true;
     731            0 :     profilingEnv = GET_ENV(MM_ENV_PROFILING_OPTIONS);
     732            0 :     CHK_PRT_RET(
     733              :         profilingEnv == "EmptyString", HCCL_RUN_INFO("[HCCL_ENV] environmental variable PROFILING_OPTIONS is not set."),
     734              :         HCCL_SUCCESS);
     735              : 
     736            0 :     g_externalInput.profilingOption = profilingEnv;
     737            0 :     HCCL_RUN_INFO("[HCCL_ENV] Set Env [PROFILING_MODE]: Value[%s]", g_externalInput.profilingOption.c_str());
     738            0 :     return HCCL_SUCCESS;
     739          392 : }
     740              : 
     741          394 : HcclResult ParseHcclWhitelistFilePath()
     742              : {
     743          394 :     CHK_PRT_RET((g_externalInput.enableWhitelist != HCCL_WHITELIST_ON), , HCCL_SUCCESS); // 白名单功能无效时无需解析
     744              : 
     745            4 :     std::string filePath = GET_ENV(MM_ENV_HCCL_WHITELIST_FILE);
     746            4 :     if (filePath == "EmptyString") {
     747            1 :         g_externalInput.hcclWhiteListFile.clear();
     748            1 :         HCCL_RUN_INFO("[HCCL_ENV][Parse][HcclWhitelistFilePath]environmental variable HCCL_WHITELIST_DISABLE is [0],"
     749              :                       "but HCCL_WHITELIST_FILE is not set");
     750              :     } else {
     751            3 :         u32 len = strnlen(filePath.c_str(), PATH_MAX);
     752            3 :         if (len == (PATH_MAX) || len == 0) {
     753            0 :             HCCL_ERROR(
     754              :                 "[Parse][HcclWhitelistFilePath]errNo[0x%016llx] env[HCCL_WHITELIST_FILE] is invalid, "
     755              :                 "len is %u",
     756              :                 HCCL_ERROR_CODE(HCCL_E_PARA), len);
     757            0 :             return HCCL_E_PARA;
     758              :         }
     759              :         // 校验文件是否存在
     760            3 :         char realFile[PATH_MAX] = {0};
     761            3 :         if (realpath(filePath.c_str(), realFile) == nullptr) {
     762            0 :             HCCL_RUN_WARNING(
     763              :                 "[HCCL_ENV][Parse][HcclWhitelistFilePath]path %s is not a valid real path", filePath.c_str());
     764            0 :             g_externalInput.hcclWhiteListFile.clear();
     765              :         } else {
     766            3 :             g_externalInput.hcclWhiteListFile = realFile;
     767              :         }
     768            3 :         HCCL_RUN_INFO(
     769              :             "[HCCL_ENV] HCCL_WHITELIST_FILE set by environment to [%s], realpath[%s].", filePath.c_str(),
     770              :             g_externalInput.hcclWhiteListFile.c_str());
     771              :     }
     772            4 :     return HCCL_SUCCESS;
     773            4 : }
     774              : 
     775          392 : HcclResult ParseMultiQpSrcPortConfigPath()
     776              : {
     777          392 :     std::string filePath = GET_ENV(MM_ENV_HCCL_RDMA_QP_PORT_CONFIG_PATH);
     778          392 :     if (filePath == "EmptyString") {
     779          391 :         g_externalInput.multiQpSrcPortConfigPath.clear();
     780          391 :         HCCL_RUN_INFO(
     781              :             "[HCCL_ENV][Parse][MultiQpSrcPortConfigPath]environmental variable HCCL_RDMA_QP_PORT_CONFIG_PATH is empty");
     782              :     } else {
     783            1 :         u32 len = filePath.size() > PATH_MAX ? PATH_MAX : filePath.size();
     784            1 :         if (len == (PATH_MAX) || len == 0) {
     785            0 :             HCCL_ERROR(
     786              :                 "[Parse][MultiQpSrcPortConfigPath]errNo[0x%016llx] env[HCCL_RDMA_QP_PORT_CONFIG_PATH] is invalid,"
     787              :                 "len is %u",
     788              :                 HCCL_ERROR_CODE(HCCL_E_PARA), len);
     789            0 :             return HCCL_E_PARA;
     790              :         }
     791              :         // 校验文件是否存在
     792            1 :         char realFile[PATH_MAX] = {0};
     793            1 :         if (realpath(filePath.c_str(), realFile) == nullptr) {
     794            0 :             HCCL_ERROR(
     795              :                 "[Parse][MultiQpSrcPortConfigPath]errNo[0x%016llx] path %s is not a valid real path",
     796              :                 HCOM_ERROR_CODE(HCCL_E_PARA), filePath.c_str());
     797            0 :             return HCCL_E_PARA;
     798              :         }
     799            1 :         g_externalInput.multiQpSrcPortConfigPath = realFile;
     800            1 :         HCCL_RUN_INFO(
     801              :             "[HCCL_ENV] HCCL_RDMA_QP_PORT_CONFIG_PATH set by environment to [%s], realpath[%s]", filePath.c_str(),
     802              :             g_externalInput.multiQpSrcPortConfigPath.c_str());
     803              :     }
     804          392 :     return HCCL_SUCCESS;
     805          392 : }
     806              : 
     807          394 : HcclResult ParseHcclWhitelistSwitch()
     808              : {
     809          394 :     std::string disableWhitelistEnv = GET_ENV(MM_ENV_HCCL_WHITELIST_DISABLE);
     810          394 :     u32 disableWhitelist = 0;
     811              : 
     812          394 :     if (disableWhitelistEnv != "EmptyString") {
     813              :         // 校验环境变量长度
     814            8 :         bool isEnvLenValid = CheckEnvLen(disableWhitelistEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     815            8 :         CHK_PRT_RET(
     816              :             !isEnvLenValid,
     817              :             HCCL_ERROR(
     818              :                 "[Parse][WhitelistSwitch]errNo[0x%016llx] Invalid HCCL_WHITELIST_DISABLE env len, len is "
     819              :                 "bigger than [%u]. errorno[%d]",
     820              :                 HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     821              :             HCCL_E_PARA);
     822            8 :         HcclResult ret = SalStrToULong(disableWhitelistEnv, HCCL_BASE_DECIMAL, disableWhitelist);
     823              :         // 若转换出错或使能开关的值不为0和1,报错并设置为默认值
     824            8 :         if (ret != HCCL_SUCCESS || disableWhitelist > 1) {
     825            0 :             HCCL_ERROR(
     826              :                 "[Parse][WhitelistSwitch]environmental variable HCCL_WHITELIST_DISABLE[%s] is invalid, "
     827              :                 "expect[%u ~ %u].",
     828              :                 disableWhitelistEnv.c_str(), 0, 1);
     829            0 :             g_externalInput.enableWhitelist = HCCL_WHITELIST_OFF;
     830            0 :             return HCCL_E_PARA;
     831              :         }
     832            8 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_WHITELIST_DISABLE set by environment to [%u]", disableWhitelist);
     833              :     } else {
     834          386 :         disableWhitelist = 1; // 缺省时关闭白名单
     835          386 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_WHITELIST_DISABLE set by default to [%u]", disableWhitelist);
     836              :     }
     837          394 :     g_externalInput.enableWhitelist = !disableWhitelist;
     838          394 :     return HCCL_SUCCESS;
     839          394 : }
     840              : 
     841          392 : HcclResult ParseHcclIfBasePort()
     842              : {
     843          392 :     std::string ifBasePort = GET_ENV(MM_ENV_HCCL_IF_BASE_PORT);
     844          392 :     u32 basePort = HCCL_INVALID_PORT;
     845              : 
     846          392 :     if (ifBasePort != "EmptyString") {
     847              :         // 校验环境变量长度
     848            1 :         bool isEnvLenValid = CheckEnvLen(ifBasePort.c_str(), MAX_LEN_OF_DIGIT_ENV);
     849            1 :         CHK_PRT_RET(
     850              :             !isEnvLenValid,
     851              :             HCCL_ERROR(
     852              :                 "[Parse][HcclIfBasePort]errNo[0x%016llx] Invalid HcclIfBasePort env len, len is bigger than "
     853              :                 "[%u]. errorno[%d]",
     854              :                 HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     855              :             HCCL_E_PARA);
     856              : 
     857            1 :         CHK_RET(IsAllDigit(ifBasePort.c_str()));
     858            1 :         HcclResult ret = SalStrToULong(ifBasePort, HCCL_BASE_DECIMAL, basePort);
     859              :         // 若数字小于1024或者数字大于65520,报错并设置为默认值HOST_CONTROL_BASE_PORT
     860            1 :         if (ret != HCCL_SUCCESS || basePort > HOST_PORT_MAX || basePort < HCCL_BASE_PORT_MIN) {
     861            0 :             HCCL_ERROR(
     862              :                 "[Parse][HcclIfBasePort]environmental variable HCCL_IF_BASE_PORT error, errNo[0x%016llx]"
     863              :                 "ifBasePort[%s] portRange[%u,%u]",
     864              :                 HCOM_ERROR_CODE(ret), ifBasePort.c_str(), HCCL_BASE_PORT_MIN, HOST_PORT_MAX);
     865            0 :             return HCCL_E_PARA;
     866              :         }
     867            1 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_IF_BASE_PORT set by environment to [%u]", basePort);
     868              :     } else {
     869          391 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_IF_BASE_PORT set by default to [%u]", HOST_CONTROL_BASE_PORT);
     870              :     }
     871          392 :     g_externalInput.hcclIfBasePort = basePort;
     872          392 :     return HCCL_SUCCESS;
     873          392 : }
     874              : 
     875          392 : HcclResult ParseHcclIfIp()
     876              : {
     877          392 :     std::string hcclControlIfIp = GET_ENV(MM_ENV_HCCL_IF_IP);
     878          392 :     if (hcclControlIfIp != "EmptyString") {
     879            5 :         CHK_PRT_RET(
     880              :             g_externalInput.hcclControlIfIp.SetReadableAddress(hcclControlIfIp),
     881              :             HCCL_ERROR("[Parse][HcclIfIp]IP address[%s] is invalid.", hcclControlIfIp.c_str()), HCCL_E_PARA);
     882            5 :         HCCL_RUN_INFO(
     883              :             "[HCCL_ENV] HCCL_IF_IP is set to [%s], ip[%s].", hcclControlIfIp.c_str(),
     884              :             g_externalInput.hcclControlIfIp.GetReadableAddress());
     885              :     } else {
     886          387 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_IF_IP is not set");
     887              :     }
     888          392 :     return HCCL_SUCCESS;
     889          392 : }
     890              : 
     891          392 : HcclResult ParseHcclSocketFamily()
     892              : {
     893          392 :     std::string hcclSocketFamily = GET_ENV(MM_ENV_HCCL_SOCKET_FAMILY);
     894          392 :     if (hcclSocketFamily != "EmptyString") {
     895            0 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_SOCKET_FAMILY set by environment to [%s]", hcclSocketFamily.c_str());
     896            0 :         if (hcclSocketFamily == "AF_INET") {
     897            0 :             g_externalInput.hcclSocketFamily = AF_INET;
     898            0 :         } else if (hcclSocketFamily == "AF_INET6") {
     899            0 :             g_externalInput.hcclSocketFamily = AF_INET6;
     900              :         } else {
     901            0 :             g_externalInput.hcclSocketFamily = -1;
     902            0 :             HCCL_ERROR(
     903              :                 "[Parse][HcclSocketFamily]environmental variable HCCL_SOCKET_FAMILY[%s] is invalid. it should "
     904              :                 "be \"AF_INET\" or \"AF_INET6\".",
     905              :                 hcclSocketFamily.c_str());
     906            0 :             return HCCL_E_PARA;
     907              :         }
     908              :     } else {
     909          392 :         g_externalInput.hcclSocketFamily = -1;
     910          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_SOCKET_FAMILY is not set and is used by default [AF_INET]");
     911              :     }
     912          392 :     return HCCL_SUCCESS;
     913          392 : }
     914              : 
     915          392 : HcclResult ParseHcclSocketIfName()
     916              : {
     917          392 :     bool searchNot = false;
     918          392 :     bool searchExact = false;
     919          392 :     std::string hcclSocketIfName = GET_ENV(MM_ENV_HCCL_SOCKET_IFNAME);
     920          392 :     std::string remainSocketIfName = hcclSocketIfName;
     921          392 :     g_externalInput.hcclSocketIfName.configIfNames.clear();
     922              : 
     923          392 :     if (hcclSocketIfName != "EmptyString") {
     924              :         // 获取HCCL_SOCKET_IFNAME环境变量匹配规则
     925            3 :         if (!hcclSocketIfName.empty() && hcclSocketIfName.at(0) == '^') {
     926            0 :             searchNot = true;
     927              :             // 获取从1位置开始剩余部分环境变量内容
     928            0 :             remainSocketIfName = hcclSocketIfName.substr(1);
     929              :         }
     930              : 
     931            3 :         if (!remainSocketIfName.empty() && remainSocketIfName.at(0) == '=') {
     932            2 :             searchExact = true;
     933            2 :             remainSocketIfName = remainSocketIfName.substr(1);
     934              :         }
     935              : 
     936              :         // 获取用户输入的网卡名列表(使用逗号隔开),将网卡名列表存放到全局vector变量中
     937            3 :         HcclResult ret = SplitHcclSocketIfName(remainSocketIfName, g_externalInput.hcclSocketIfName.configIfNames);
     938            3 :         CHK_PRT_RET(
     939              :             ret != HCCL_SUCCESS,
     940              :             HCCL_ERROR("[Parse][HcclSocketIfName]hccl IfName config[%s] is invalid.", hcclSocketIfName.c_str()),
     941              :             HCCL_E_PARA);
     942            3 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_SOCKET_IFNAME set by environment to [%s]", hcclSocketIfName.c_str());
     943              :     } else {
     944          389 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_SOCKET_IFNAME set by default to [%s]", hcclSocketIfName.c_str());
     945              :     }
     946          392 :     g_externalInput.hcclSocketIfName.searchNot = searchNot;
     947          392 :     g_externalInput.hcclSocketIfName.searchExact = searchExact;
     948          392 :     return HCCL_SUCCESS;
     949          392 : }
     950              : 
     951            3 : HcclResult SplitHcclSocketIfName(const std::string& socketIfName, std::vector<std::string>& configIfNames)
     952              : {
     953            3 :     std::string remainSocketIfName;
     954            3 :     std::size_t found = socketIfName.find(",");
     955            3 :     if ((found == 0) || (found == (socketIfName.length() - 1))) {
     956            0 :         HCCL_ERROR("[Split][HcclSocketIfName] configIfNames config is invalid.");
     957            0 :         return HCCL_E_PARA;
     958            3 :     } else if (found != std::string::npos) {
     959            0 :         remainSocketIfName = socketIfName.substr(found + 1);
     960              :     } else {
     961              :         // 最后一组配置,剩余的字符串为空
     962              :     }
     963            3 :     configIfNames.push_back(socketIfName.substr(0, found));
     964              : 
     965            3 :     if (!remainSocketIfName.empty()) {
     966            0 :         CHK_RET(SplitHcclSocketIfName(remainSocketIfName, configIfNames));
     967              :     }
     968              : 
     969            3 :     return HCCL_SUCCESS;
     970            3 : }
     971              : 
     972            3 : HcclResult SetHccLExecTimeOut(const char* execTimeOutStr, const HcclExecTimeoutSet execTimeOutSet)
     973              : {
     974            3 :     CHK_PTR_NULL(execTimeOutStr);
     975            6 :     if (!IsValidExecTimeOutMs(execTimeOutStr)) {
     976            0 :         HCCL_ERROR("[SetHccLExecTimeOut]Invalid config value, execTimeOutStr[%s]", execTimeOutStr);
     977            0 :         RPT_ENV_ERR(
     978              :             true, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     979              :             std::vector<std::string>(
     980              :                 {std::string(execTimeOutStr), "HCCL_EXEC_TIMEOUT", "a valid number in the specified range"}));
     981            0 :         return HCCL_E_PARA;
     982              :     }
     983              :     DevType deviceType;
     984            3 :     CHK_RET(hrtGetDeviceType(deviceType)); // 910A和910B要分开
     985            3 :     double hcclExecTimeout = (deviceType == DevType::DEV_TYPE_910_93 || deviceType == DevType::DEV_TYPE_910B) ?
     986              :                                  HCCL_EXEC_TIME_OUT_S_910_93 :
     987              :                                  HCCL_EXEC_TIME_OUT_S;
     988            3 :     double execTimeOut = hcclExecTimeout;
     989            3 :     g_externalInput.execTimeOut = hcclExecTimeout;
     990            3 :     HcclResult ret = SalStrToDouble(execTimeOutStr, execTimeOut);
     991            3 :     bool flag = false;
     992            3 :     std::string inputValue = (execTimeOutStr ? execTimeOutStr : "NULL");
     993            3 :     if (deviceType == DevType::DEV_TYPE_910_93 || deviceType == DevType::DEV_TYPE_910B) {
     994              :         // 910B和910_93算子超时时间范围0s-2147483647s,其中0代表永不超时
     995            0 :         flag = (ret != HCCL_SUCCESS || (execTimeOut < 0) || (execTimeOut > HCCL_EXEC_TIME_OUT_S_910_93));
     996            0 :         RPT_ENV_ERR(
     997              :             flag, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
     998              :             std::vector<std::string>(
     999              :                 {inputValue, "HCCL_EXEC_TIMEOUT",
    1000              :                  "a number greater than or equal to 0s and less "
    1001              :                  "than or equal to 2147483647s"}));
    1002            0 :         CHK_PRT_RET(
    1003              :             flag,
    1004              :             HCCL_ERROR(
    1005              :                 "[%s][%s]ExecTimeOut[%s]s is invalid. except: [0, %d]", LOG_KEYWORDS_INIT_GROUP.c_str(),
    1006              :                 LOG_KEYWORDS_ENV_CONFIG.c_str(), execTimeOutStr, HCCL_EXEC_TIME_OUT_S_910_93),
    1007              :             HCCL_E_PARA);
    1008              :     } else {
    1009              :         // 非910B和910_93算子超时时间范围1s-17340s
    1010            3 :         flag = (ret != HCCL_SUCCESS || (execTimeOut <= 0) || (execTimeOut > HCCL_EXEC_TIME_OUT_S));
    1011            3 :         RPT_ENV_ERR(
    1012              :             flag, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
    1013              :             std::vector<std::string>(
    1014              :                 {inputValue, "HCCL_EXEC_TIMEOUT",
    1015              :                  "a number greater than or equal to 1s and less than or equal to 17340s"}));
    1016            3 :         CHK_PRT_RET(
    1017              :             flag,
    1018              :             HCCL_ERROR(
    1019              :                 "[%s][%s]ExecTimeOut[%s]s is invalid. except: [1, %d]", LOG_KEYWORDS_INIT_GROUP.c_str(),
    1020              :                 LOG_KEYWORDS_ENV_CONFIG.c_str(), execTimeOutStr, HCCL_EXEC_TIME_OUT_S),
    1021              :             HCCL_E_PARA);
    1022            3 :         s32 intPart = static_cast<s32>(execTimeOut / HCCL_INTEVAL_EXEC_TIME_OUT_S);
    1023            3 :         intPart = (intPart == 0) ? 1 : intPart;
    1024            3 :         execTimeOut = intPart * HCCL_INTEVAL_EXEC_TIME_OUT_S;
    1025              :     }
    1026            3 :     g_externalInput.execTimeOut = execTimeOut;
    1027            3 :     g_externalInput.execTimeOutSet = execTimeOutSet;
    1028            3 :     if (execTimeOutSet == HcclExecTimeoutSet::HCCL_EXEC_TIMEOUT_SET_BY_ENV) {
    1029            3 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_EXEC_TIMEOUT set by environment to [%.2f]s", execTimeOut);
    1030              :     } else {
    1031            0 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_EXEC_TIMEOUT set by GE option to [%.2f]s", execTimeOut);
    1032              :     }
    1033            3 :     return HCCL_SUCCESS;
    1034            3 : }
    1035              : 
    1036           19 : bool CheckEnvLen(const char* envStr, u32 envMaxLen)
    1037              : {
    1038              :     // 校验环境变量长度
    1039           19 :     u32 envLen = strnlen(envStr, envMaxLen + 1);
    1040           19 :     if (envLen == (envMaxLen + 1)) {
    1041            0 :         HCCL_ERROR(
    1042              :             "[Check][EnvLen]errNo[0x%016llx] env len is invalid, len is %u", HCCL_ERROR_CODE(HCCL_E_PARA), envLen);
    1043            0 :         return false;
    1044              :     }
    1045           19 :     return true;
    1046              : }
    1047            0 : HcclResult SetMasterInfo(
    1048              :     const string& masterIp, const string& masterPort, const string& masterDeviceId, const string& rankSize,
    1049              :     const string& rankIp)
    1050              : {
    1051            0 :     HcclResult ret = HCCL_SUCCESS;
    1052            0 :     ret = g_externalInput.masterInfo.serverIp.SetReadableAddress(masterIp);
    1053            0 :     if (ret != HCCL_SUCCESS) {
    1054            0 :         RPT_ENV_ERR(
    1055              :             ret, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
    1056              :             std::vector<std::string>({masterIp, "CM_CHIEF_IP", "a valid IPv4/IPv6 address string"}));
    1057            0 :         HCCL_ERROR(
    1058              :             "[%s][%s]errNo[0x%016llx] %s errorno[%d]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(),
    1059              :             HCOM_ERROR_CODE(ret), "Invalid masterIp address", ret);
    1060            0 :         return HCCL_E_PARA;
    1061              :     }
    1062              : 
    1063            0 :     ret = IsAllDigit(masterPort.c_str());
    1064            0 :     ret = (ret == HCCL_SUCCESS) ? SalStrToULong(masterPort, HCCL_BASE_DECIMAL, g_externalInput.masterInfo.port) : ret;
    1065            0 :     if (ret != HCCL_SUCCESS || g_externalInput.masterInfo.port > HOST_PORT_MAX) {
    1066            0 :         RPT_ENV_ERR(
    1067              :             HCCL_E_PARA, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
    1068              :             std::vector<std::string>({masterPort, "CM_CHIEF_PORT", "a unsigned number less than the max port num"}));
    1069            0 :         HCCL_ERROR(
    1070              :             "[%s][%s]errNo[0x%016llx] option masterPort[CM_CHIEF_PORT] error, %s errorno[%d]",
    1071              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCOM_ERROR_CODE(ret), "out of range",
    1072              :             ret);
    1073            0 :         return HCCL_E_PARA;
    1074              :     }
    1075              : 
    1076            0 :     ret = IsAllDigit(masterDeviceId.c_str());
    1077            0 :     ret = (ret == HCCL_SUCCESS) ?
    1078            0 :               SalStrToULong(masterDeviceId, HCCL_BASE_DECIMAL, g_externalInput.masterInfo.serverDeviceId) :
    1079              :               ret;
    1080              :     u32 maxDeviceNum;
    1081            0 :     CHK_RET(GetMaxDevNum(maxDeviceNum));
    1082            0 :     if (ret != HCCL_SUCCESS || g_externalInput.masterInfo.serverDeviceId >= maxDeviceNum) {
    1083            0 :         RPT_ENV_ERR(
    1084              :             HCCL_E_PARA, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
    1085              :             std::vector<std::string>(
    1086              :                 {masterDeviceId, "CM_CHIEF_DEVICE", "a unsigned number less than the max device num"}));
    1087            0 :         HCCL_ERROR(
    1088              :             "[%s][%s]errNo[0x%016llx] option master device id[CM_CHIEF_DEVICE] error, masterDeviceId[%s]"
    1089              :             "errorno[%d]",
    1090              :             LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCOM_ERROR_CODE(ret),
    1091              :             masterDeviceId.c_str(), ret);
    1092            0 :         return HCCL_E_PARA;
    1093              :     }
    1094              : 
    1095            0 :     if (rankIp.size() == 0) {
    1096            0 :         g_externalInput.masterInfo.agentIp.clear();
    1097              :     } else {
    1098            0 :         ret = g_externalInput.masterInfo.agentIp.SetReadableAddress(rankIp);
    1099            0 :         if (ret != HCCL_SUCCESS) {
    1100            0 :             RPT_ENV_ERR(
    1101              :                 HCCL_E_PARA, "EI0001", std::vector<std::string>({"value", "env", "expect"}),
    1102              :                 std::vector<std::string>({rankIp, "CM_WORKER_IP", "an available ip"}));
    1103            0 :             HCCL_ERROR(
    1104              :                 "[%s][%s]errNo[0x%016llx] masterIp agent address[CM_WORKER_IP][%s] is invalid. errorno[%d]",
    1105              :                 LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_ENV_CONFIG.c_str(), HCOM_ERROR_CODE(ret), rankIp.c_str(),
    1106              :                 ret);
    1107            0 :             return HCCL_E_PARA;
    1108              :         }
    1109              :     }
    1110              : 
    1111            0 :     ret = IsAllDigit(rankSize.c_str());
    1112            0 :     ret = (ret == HCCL_SUCCESS) ? SalStrToULong(rankSize, HCCL_BASE_DECIMAL, g_externalInput.masterInfo.rankSize) : ret;
    1113            0 :     if (ret != HCCL_SUCCESS) {
    1114            0 :         HCCL_ERROR(
    1115              :             "[Parse][HcclMasterInfo] option rankSize[CM_WORKER_SIZE] error, errNo[0x%016llx] rankSize[%s]",
    1116              :             HCOM_ERROR_CODE(ret), rankSize.c_str());
    1117            0 :         return HCCL_E_PARA;
    1118              :     }
    1119            0 :     return HCCL_SUCCESS;
    1120            0 : }
    1121          515 : HcclResult SetTcpMode(const bool isTcpMode)
    1122              : {
    1123          515 :     g_externalInput.isTcpMode = isTcpMode;
    1124          515 :     return HCCL_SUCCESS;
    1125              : }
    1126              : 
    1127            0 : u32 GetEsMaxPsTable() { return g_externalInput.esMaxPsTable; }
    1128              : 
    1129            0 : HcclResult SetEsStreamNum(const u32 streamNum)
    1130              : {
    1131            0 :     g_externalInput.streamNum = streamNum;
    1132            0 :     return HCCL_SUCCESS;
    1133              : }
    1134              : 
    1135            0 : u32 GetEsStreamNum() { return g_externalInput.streamNum; }
    1136              : 
    1137            2 : HcclResult SetDeterministic(u8 deterministic)
    1138              : {
    1139            2 :     g_externalInput.hcclDeterministic = deterministic;
    1140            2 :     return HCCL_SUCCESS;
    1141              : }
    1142              : 
    1143            0 : void SetDumpDebugMode(const bool dumpDebug)
    1144              : {
    1145            0 :     g_externalInput.dumpDebug = dumpDebug;
    1146            0 :     return;
    1147              : }
    1148              : 
    1149          462 : HcclResult SetFftsSwitch(const bool switchStatus)
    1150              : {
    1151          462 :     g_externalInput.enableFfts = switchStatus;
    1152          462 :     return HCCL_SUCCESS;
    1153              : }
    1154              : 
    1155          392 : HcclResult ParseRDMATrafficClass()
    1156              : {
    1157          392 :     std::string trafficClassEnv = GET_ENV(MM_ENV_HCCL_RDMA_TC);
    1158          392 :     u32 rdmaTrafficClass = HCCL_RDMA_TC_DEFAULT;
    1159              : 
    1160          392 :     if (trafficClassEnv == "EmptyString") {
    1161          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_TC set by default to [%u]", rdmaTrafficClass);
    1162          392 :         return HCCL_SUCCESS;
    1163              :     }
    1164              : 
    1165              :     // 校验环境变量长度
    1166            0 :     bool isEnvLenValid = CheckEnvLen(trafficClassEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1167              : 
    1168            0 :     CHK_PRT_RET(
    1169              :         !isEnvLenValid,
    1170              :         HCCL_ERROR(
    1171              :             "[Parse][TrafficClass]errNo[0x%016llx] Invalid HCCL_RDMA_TC env len, len is bigger than "
    1172              :             "[%u]. errorno[%d]",
    1173              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1174              :         HCCL_E_PARA);
    1175              : 
    1176            0 :     g_externalInput.rdmaTrafficClass = HCCL_RDMA_TC_DEFAULT;
    1177            0 :     CHK_RET(IsAllDigit(trafficClassEnv.c_str()));
    1178              : 
    1179            0 :     HcclResult ret = SalStrToULong(trafficClassEnv.c_str(), HCCL_BASE_DECIMAL, rdmaTrafficClass);
    1180              :     // 若转换出错或者设置的RDMATrafficClass不在有效范围内,报错
    1181            0 :     CHK_PRT_RET(
    1182              :         (ret != HCCL_SUCCESS || rdmaTrafficClass > HCCL_RDMA_TC_MAX),
    1183              :         HCCL_ERROR(
    1184              :             "[Parse][TrafficClass]HCCL_RDMA_TC[%s] is invalid. except: [%u, %u]", trafficClassEnv.c_str(),
    1185              :             HCCL_RDMA_TC_MIN, HCCL_RDMA_TC_MAX),
    1186              :         HCCL_E_PARA);
    1187              :     // 设置的RDMATrafficClass需要是4的整数倍, 否则报错
    1188            0 :     if (rdmaTrafficClass % HCCL_RDMA_TC_BASE != 0) {
    1189            0 :         HCCL_ERROR("rdmaTrafficClass[%u] is not a multiple of [%u]", rdmaTrafficClass, HCCL_RDMA_TC_BASE);
    1190            0 :         return HCCL_E_PARA;
    1191              :     }
    1192            0 :     g_externalInput.rdmaTrafficClass = rdmaTrafficClass;
    1193            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_TC set by environment to [%u]", rdmaTrafficClass);
    1194            0 :     return HCCL_SUCCESS;
    1195          392 : }
    1196              : 
    1197          392 : HcclResult ParseRDMAServerLevel()
    1198              : {
    1199          392 :     std::string serverLevelEnv = GET_ENV(MM_ENV_HCCL_RDMA_SL);
    1200          392 :     u32 rdmaServerLevel = HCCL_RDMA_SL_DEFAULT;
    1201              : 
    1202          392 :     if (serverLevelEnv == "EmptyString") {
    1203          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_SL set by default to [%u]", rdmaServerLevel);
    1204          392 :         return HCCL_SUCCESS;
    1205              :     }
    1206              : 
    1207              :     // 校验环境变量长度
    1208            0 :     bool isEnvLenValid = CheckEnvLen(serverLevelEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1209              : 
    1210            0 :     CHK_PRT_RET(
    1211              :         !isEnvLenValid,
    1212              :         HCCL_ERROR(
    1213              :             "[Parse][rdmaServerLevel]errNo[0x%016llx] Invalid HCCL_RDMA_SL env len, len is bigger than "
    1214              :             "[%u]. errorno[%d]",
    1215              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1216              :         HCCL_E_PARA);
    1217              : 
    1218            0 :     g_externalInput.rdmaServerLevel = HCCL_RDMA_SL_DEFAULT;
    1219            0 :     CHK_RET(IsAllDigit(serverLevelEnv.c_str()));
    1220              : 
    1221            0 :     HcclResult ret = SalStrToULong(serverLevelEnv.c_str(), HCCL_BASE_DECIMAL, rdmaServerLevel);
    1222              :     // 若转换出错或者设置的RDMAServerLevel不在有效范围内,报错
    1223            0 :     CHK_PRT_RET(
    1224              :         (ret != HCCL_SUCCESS || rdmaServerLevel > HCCL_RDMA_SL_MAX),
    1225              :         HCCL_ERROR(
    1226              :             "[Parse][rdmaServerLevel]HCCL_RDMA_SL[%s] is invalid. except: [%u, %u]", serverLevelEnv.c_str(),
    1227              :             HCCL_RDMA_SL_MIN, HCCL_RDMA_SL_MAX),
    1228              :         HCCL_E_PARA);
    1229            0 :     g_externalInput.rdmaServerLevel = rdmaServerLevel;
    1230            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_SL set by environment to [%u]", rdmaServerLevel);
    1231            0 :     return HCCL_SUCCESS;
    1232          392 : }
    1233              : 
    1234          392 : HcclResult ParseRDMATimeOut(std::pair<u32, u32>& rdmaTimeOutRange)
    1235              : {
    1236              :     u32 rdmaTimeOutMax;
    1237              : #ifndef HCCD
    1238          392 :     if (!IsGeneralServer()) {
    1239              :         DevType deviceType;
    1240          392 :         CHK_RET(hrtGetDeviceType(deviceType));
    1241          392 :         rdmaTimeOutMax = (deviceType == DevType::DEV_TYPE_910_93 || deviceType == DevType::DEV_TYPE_910B) ?
    1242              :                              HCCL_RDMA_TIMEOUT_MAX_910_93 :
    1243              :                              HCCL_RDMA_TIMEOUT_MAX;
    1244              :     } else {
    1245            0 :         rdmaTimeOutMax = HCCL_RDMA_TIMEOUT_MAX;
    1246              :     }
    1247              : #else
    1248              :     rdmaTimeOutMax = HCCL_RDMA_TIMEOUT_MAX;
    1249              : #endif
    1250          392 :     rdmaTimeOutRange.first = HCCL_RDMA_TIMEOUT_MIN;
    1251          392 :     rdmaTimeOutRange.second = rdmaTimeOutMax;
    1252          392 :     std::string timeOutEnv = GET_ENV(MM_ENV_HCCL_RDMA_TIMEOUT);
    1253          392 :     u32 rdmaTimeOut = HCCL_RDMA_TIMEOUT_DEFAULT;
    1254          392 :     if (timeOutEnv == "EmptyString") {
    1255          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_TIMEOUT set by default to [%u]", rdmaTimeOut);
    1256          392 :         return HCCL_SUCCESS;
    1257              :     }
    1258              : 
    1259              :     // 校验环境变量长度
    1260            0 :     bool isEnvLenValid = CheckEnvLen(timeOutEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1261              : 
    1262            0 :     CHK_PRT_RET(
    1263              :         !isEnvLenValid,
    1264              :         HCCL_ERROR(
    1265              :             "[Parse][TrafficClass]errNo[0x%016llx] Invalid HCCL_RDMA_TIMEOUT env len, len is bigger than "
    1266              :             "[%u]. errorno[%d]",
    1267              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1268              :         HCCL_E_PARA);
    1269              : 
    1270            0 :     g_externalInput.rdmaTimeOut = HCCL_RDMA_TIMEOUT_DEFAULT;
    1271            0 :     CHK_RET(IsAllDigit(timeOutEnv.c_str()));
    1272              : 
    1273            0 :     HcclResult ret = SalStrToULong(timeOutEnv.c_str(), HCCL_BASE_DECIMAL, rdmaTimeOut);
    1274              :     // 若转换出错或者设置的RDMATrafficClass不在有效范围内,报错
    1275            0 :     CHK_PRT_RET(
    1276              :         (ret != HCCL_SUCCESS || rdmaTimeOut < HCCL_RDMA_TIMEOUT_MIN || rdmaTimeOut > rdmaTimeOutMax),
    1277              :         HCCL_ERROR(
    1278              :             "[Parse][TrafficClass]HCCL_RDMA_TIMEOUT[%s] is invalid. except: [%u, %u]", timeOutEnv.c_str(),
    1279              :             HCCL_RDMA_TIMEOUT_MIN, rdmaTimeOutMax),
    1280              :         HCCL_E_PARA);
    1281              : 
    1282            0 :     g_externalInput.rdmaTimeOut = rdmaTimeOut;
    1283            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_TIMEOUT set by environment to [%u]", rdmaTimeOut);
    1284            0 :     return HCCL_SUCCESS;
    1285          392 : }
    1286              : 
    1287          392 : HcclResult ParseRDMARetryCnt()
    1288              : {
    1289          392 :     std::string retryCntEnv = GET_ENV(MM_ENV_HCCL_RDMA_RETRY_CNT);
    1290          392 :     u32 rdmaRetryCnt = HCCL_RDMA_RETRY_CNT_DEFAULT;
    1291          392 :     if (retryCntEnv == "EmptyString") {
    1292          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_RETRY_CNT set by default to [%u]", rdmaRetryCnt);
    1293          392 :         return HCCL_SUCCESS;
    1294              :     }
    1295              : 
    1296              :     // 校验环境变量长度
    1297            0 :     bool isEnvLenValid = CheckEnvLen(retryCntEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1298              : 
    1299            0 :     CHK_PRT_RET(
    1300              :         !isEnvLenValid,
    1301              :         HCCL_ERROR(
    1302              :             "[Parse][rdmaRetryCnt]errNo[0x%016llx] Invalid HCCL_RDMA_RETRY_CNT env len, len is bigger than "
    1303              :             "[%u]. errorno[%d]",
    1304              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1305              :         HCCL_E_PARA);
    1306              : 
    1307            0 :     g_externalInput.rdmaRetryCnt = HCCL_RDMA_RETRY_CNT_DEFAULT;
    1308            0 :     CHK_RET(IsAllDigit(retryCntEnv.c_str()));
    1309              : 
    1310            0 :     HcclResult ret = SalStrToULong(retryCntEnv.c_str(), HCCL_BASE_DECIMAL, rdmaRetryCnt);
    1311              :     // 若转换出错或者设置的RDMAServerLevel不在有效范围内,报错
    1312            0 :     CHK_PRT_RET(
    1313              :         (ret != HCCL_SUCCESS || rdmaRetryCnt < HCCL_RDMA_RETRY_CNT_MIN || rdmaRetryCnt > HCCL_RDMA_RETRY_CNT_MAX),
    1314              :         HCCL_ERROR(
    1315              :             "[Parse][rdmaRetryCnt]HCCL_RDMA_RETRY_CNT[%s] is invalid. except: [%u, %u]", retryCntEnv.c_str(),
    1316              :             HCCL_RDMA_RETRY_CNT_MIN, HCCL_RDMA_RETRY_CNT_MAX),
    1317              :         HCCL_E_PARA);
    1318            0 :     g_externalInput.rdmaRetryCnt = rdmaRetryCnt;
    1319            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_RETRY_CNT set by environment to [%u]", rdmaRetryCnt);
    1320            0 :     return HCCL_SUCCESS;
    1321          392 : }
    1322              : #if !defined(CCL_KERNEL_AICPU) && !defined(HCCD)
    1323              : namespace {
    1324              : #define PKG_VERSION_MAX_SIZE 128
    1325              : constexpr auto kVersionInfoKey = "Version=";
    1326              : constexpr auto kRelPathInfo = "/share/info/";
    1327              : constexpr auto kInfoFileName = "/version.info";
    1328          784 : std::string Trim(const std::string& str)
    1329              : {
    1330          784 :     const size_t first = str.find_first_not_of(" \t\r\n");
    1331          784 :     if (std::string::npos == first) {
    1332            0 :         return "";
    1333              :     }
    1334          784 :     const size_t last = str.find_last_not_of(" \t\r\n");
    1335          784 :     return str.substr(first, (last - first + 1));
    1336              : }
    1337              : 
    1338          784 : HcclResult GetVersionStringInternal(
    1339              :     const std::string& fullPath, const char_t* pkgName, std::string& versionOut, bool isSilent = false)
    1340              : {
    1341          784 :     std::ifstream ifs(fullPath);
    1342          784 :     if (!ifs.is_open()) {
    1343            0 :         if (isSilent) {
    1344            0 :             HCCL_WARNING("Version file not found at [%s] (Silent check, will retry alternative).", fullPath.c_str());
    1345              :         } else {
    1346            0 :             HCCL_WARNING(
    1347              :                 "Version file not found at [%s]. Please check if package name [%s] is correct and package is "
    1348              :                 "installed.",
    1349              :                 fullPath.c_str(), pkgName);
    1350              :         }
    1351            0 :         return HCCL_E_OPEN_FILE_FAILURE;
    1352              :     }
    1353          784 :     std::string line;
    1354          784 :     bool found = false;
    1355          784 :     const size_t keyLen = std::strlen(kVersionInfoKey);
    1356          784 :     while (std::getline(ifs, line)) {
    1357          784 :         const size_t pos = line.find(kVersionInfoKey);
    1358          784 :         if (pos != std::string::npos) {
    1359          784 :             versionOut = Trim(line.substr(pos + keyLen));
    1360          784 :             found = true;
    1361          784 :             break;
    1362              :         }
    1363              :     }
    1364          784 :     ifs.close();
    1365          784 :     if (!found || versionOut.empty()) {
    1366            0 :         HCCL_WARNING("Keyword [%s] not found in file [%s].", kVersionInfoKey, fullPath.c_str());
    1367            0 :         return HCCL_E_NOT_FOUND;
    1368              :     }
    1369          784 :     return HCCL_SUCCESS;
    1370          784 : }
    1371              : 
    1372          784 : std::string GetLocalRealPath(const std::string& path)
    1373              : {
    1374          784 :     if (path.empty()) {
    1375            0 :         return "";
    1376              :     }
    1377          784 :     char resolvedPath[PATH_MAX] = {0};
    1378          784 :     if (realpath(path.c_str(), resolvedPath) == nullptr) {
    1379            0 :         HCCL_WARNING("Failed to get real path for [%s], errno:%d", path.c_str(), errno);
    1380            0 :         return "";
    1381              :     }
    1382         1568 :     return std::string(resolvedPath);
    1383              : }
    1384              : 
    1385          784 : HcclResult GetVersionByPkgName(const std::string& targetPkgName, std::string& versionContent, bool isSilent)
    1386              : {
    1387          784 :     const char* pathEnv = nullptr;
    1388          784 :     MM_SYS_GET_ENV(MM_ENV_ASCEND_HOME_PATH, pathEnv);
    1389          784 :     if (pathEnv == nullptr) {
    1390            0 :         HCCL_WARNING("Can not get env [%s]. Please check if ASCEND_HOME_PATH is set.", "ASCEND_HOME_PATH");
    1391            0 :         return HCCL_E_OPEN_FILE_FAILURE;
    1392              :     }
    1393          784 :     std::string homePath(pathEnv);
    1394          784 :     homePath = GetLocalRealPath(homePath);
    1395          784 :     if (homePath.empty()) {
    1396            0 :         HCCL_WARNING("ASCEND_HOME_PATH [%s] does not exist.", homePath.c_str());
    1397            0 :         return HCCL_E_OPEN_FILE_FAILURE;
    1398              :     }
    1399          784 :     const std::string fullPath = homePath + kRelPathInfo + targetPkgName + kInfoFileName;
    1400          784 :     return GetVersionStringInternal(fullPath, targetPkgName.c_str(), versionContent, isSilent);
    1401          784 : }
    1402          784 : HcclResult GetPkgVersionContent(const char* pkgName, std::string& versionContent)
    1403              : {
    1404          784 :     const std::string originPkgName(pkgName);
    1405          784 :     std::string altPkgName = originPkgName;
    1406          784 :     bool hasAlternative = false;
    1407              : 
    1408          784 :     if (originPkgName.find('-') != std::string::npos) {
    1409            0 :         std::replace(altPkgName.begin(), altPkgName.end(), '-', '_');
    1410            0 :         hasAlternative = true;
    1411          784 :     } else if (originPkgName.find('_') != std::string::npos) {
    1412            0 :         std::replace(altPkgName.begin(), altPkgName.end(), '_', '-');
    1413            0 :         hasAlternative = true;
    1414              :     }
    1415          784 :     const bool isSilent = hasAlternative;
    1416          784 :     HcclResult ret = GetVersionByPkgName(originPkgName, versionContent, isSilent);
    1417          784 :     if (ret == HCCL_SUCCESS) {
    1418          784 :         return ret;
    1419              :     }
    1420            0 :     if (hasAlternative) {
    1421            0 :         HCCL_INFO("Pkg [%s] not found, trying alternative name [%s]...", originPkgName.c_str(), altPkgName.c_str());
    1422              : 
    1423            0 :         ret = GetVersionByPkgName(altPkgName, versionContent, false);
    1424            0 :         if (ret == HCCL_SUCCESS) {
    1425            0 :             HCCL_INFO("Found version info using alternative name [%s].", altPkgName.c_str());
    1426            0 :             return HCCL_SUCCESS;
    1427              :         }
    1428              :     }
    1429            0 :     return ret;
    1430          784 : }
    1431              : 
    1432          784 : HcclResult GetPkgVersionStr(char* pkgName, char* versionStr)
    1433              : {
    1434          784 :     HCCL_INFO("start to execute GetPkgVersionStr.");
    1435          784 :     CHK_PTR_NULL(versionStr);
    1436          784 :     CHK_PTR_NULL(pkgName);
    1437          784 :     std::string verInfo;
    1438          784 :     const HcclResult ret = GetPkgVersionContent(pkgName, verInfo);
    1439          784 :     if (ret != HCCL_SUCCESS) {
    1440            0 :         return ret;
    1441              :     }
    1442          784 :     if (strcpy_s(versionStr, PKG_VERSION_MAX_SIZE, verInfo.c_str()) != EOK) {
    1443            0 :         HCCL_WARNING(
    1444              :             "Copy string failed. Dest buffer size is [%d], source len is [%lu].", PKG_VERSION_MAX_SIZE,
    1445              :             verInfo.length());
    1446            0 :         return HCCL_E_INTERNAL;
    1447              :     }
    1448          784 :     HCCL_INFO("GetPkgVersionStr success. Pkg:[%s], Ver:[%s]", pkgName, versionStr);
    1449          784 :     return ret;
    1450          784 : }
    1451              : 
    1452              : } // namespace
    1453              : #endif
    1454              : 
    1455          392 : HcclResult ParseCannVersion()
    1456              : {
    1457              : #if !defined(CCL_KERNEL_AICPU) && !defined(HCCD)
    1458          392 :     char hcommPkgName[] = "hcomm";
    1459          392 :     char hcclPkgName[] = "hccl";
    1460          392 :     constexpr u32 HCCL_VERSION_STR_MAX_LEN = 128;
    1461          392 :     std::vector<char> hcommVersion(HCCL_VERSION_STR_MAX_LEN, 0);
    1462          392 :     std::vector<char> hcclVersion(HCCL_VERSION_STR_MAX_LEN, 0);
    1463          392 :     HcclResult versionRet = GetPkgVersionStr(hcommPkgName, hcommVersion.data());
    1464          392 :     CHK_PRT_RET(
    1465              :         versionRet != HCCL_SUCCESS,
    1466              :         HCCL_WARNING("[Parse][CannVersion]failed to get hcomm version, ret[%d]", versionRet), HCCL_E_NOT_FOUND);
    1467          392 :     versionRet = GetPkgVersionStr(hcclPkgName, hcclVersion.data());
    1468          392 :     if (versionRet != HCCL_SUCCESS) {
    1469            0 :         HCCL_WARNING("[Parse][CannVersion]failed to get hccl version, ret[%d]", versionRet);
    1470            0 :         hcclVersion.assign(HCCL_VERSION_STR_MAX_LEN, 0);
    1471              :     }
    1472          392 :     const size_t hlen = strnlen(hcommVersion.data(), HCCL_VERSION_STR_MAX_LEN);
    1473          392 :     const size_t clen = strnlen(hcclVersion.data(), HCCL_VERSION_STR_MAX_LEN);
    1474          392 :     if (hlen == 0 || hlen == HCCL_VERSION_STR_MAX_LEN) {
    1475            0 :         HCCL_WARNING("[Parse][CannVersion]hcomm version is empty", std::string(hcommVersion.data(), hlen).c_str());
    1476            0 :         return HCCL_E_NOT_FOUND;
    1477              :     }
    1478          392 :     g_externalInput.cannVersion = std::string(hcommVersion.data());
    1479          392 :     if (clen != 0 && clen != HCCL_VERSION_STR_MAX_LEN) {
    1480          392 :         g_externalInput.cannVersion += "_" + std::string(hcclVersion.data());
    1481         1960 :         HCCL_RUN_INFO(
    1482              :             "[Parse][CannVersion]success, hcomm version is %s, hccl version is %s ",
    1483              :             std::string(hcommVersion.data()).c_str(), std::string(hcclVersion.data()).c_str());
    1484              :     } else {
    1485            0 :         HCCL_RUN_INFO(
    1486              :             "[Parse][CannVersion]success, hcomm version is %s, but hccl package not found.",
    1487              :             std::string(hcommVersion.data()).c_str());
    1488              :     }
    1489          392 :     return HcclResult::HCCL_SUCCESS;
    1490              : #else
    1491              :     HCCL_WARNING("[ParseCannVersion]Does not support this interface.");
    1492              :     return HCCL_E_NOT_SUPPORT;
    1493              : #endif
    1494          392 : }
    1495              : 
    1496          392 : HcclResult ParseCclBufferSize()
    1497              : {
    1498          392 :     std::string hcclBufferSize = GET_ENV(MM_ENV_HCCL_BUFFSIZE);
    1499          392 :     u32 cclBufferSize = HCCL_CCL_COMM_DEFAULT_BUFFER_SIZE;
    1500          392 :     if (hcclBufferSize == "EmptyString") {
    1501          386 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_BUFFSIZE set by default to [%u]M", cclBufferSize);
    1502          386 :         return HCCL_SUCCESS;
    1503              :     }
    1504              : 
    1505              :     // 校验环境变量长度
    1506            6 :     bool isEnvLenValid = CheckEnvLen(hcclBufferSize.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1507              : 
    1508            6 :     CHK_PRT_RET(
    1509              :         !isEnvLenValid,
    1510              :         HCCL_ERROR(
    1511              :             "[Parse][CclBufferSize]errNo[0x%016llx] Invalid HCCL_BUFFSIZE env len, len is bigger than "
    1512              :             "[%u]. errorno[%d]",
    1513              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1514              :         HCCL_E_PARA);
    1515              : 
    1516            6 :     u64 cclBufFixedCalcSize = HCCL_CCL_COMM_FIXED_CALC_BUFFER_SIZE;
    1517            6 :     CHK_RET(IsAllDigit(hcclBufferSize.c_str()));
    1518              : 
    1519            6 :     HcclResult ret = SalStrToULong(hcclBufferSize.c_str(), HCCL_BASE_DECIMAL, cclBufferSize);
    1520              :     // 若转换出错或者设置的CclBufferSize不在有效范围内,报错
    1521            6 :     CHK_PRT_RET(
    1522              :         (ret != HCCL_SUCCESS || cclBufferSize < HCCL_CCL_COMM_BUFFER_MIN),
    1523              :         HCCL_ERROR(
    1524              :             "[Parse][CclBufferSize]external input CclBufferSize[%uM] should be greater than %uM", cclBufferSize,
    1525              :             HCCL_CCL_COMM_BUFFER_MIN),
    1526              :         HCCL_E_PARA);
    1527            6 :     g_externalInput.cclBufferSize = static_cast<u64>(cclBufferSize * cclBufFixedCalcSize);
    1528            6 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_BUFFSIZE set by environment to [%u]M", cclBufferSize);
    1529            6 :     return HCCL_SUCCESS;
    1530          392 : }
    1531              : 
    1532          606 : void SetIfProfile(bool ifProfile) { g_ifProf = ifProfile; }
    1533              : 
    1534          850 : const bool& GetIfProfile() { return g_ifProf; }
    1535              : 
    1536            9 : void SetProfConfig(u64 profConfig)
    1537              : {
    1538            9 :     g_externalInput.profConfig = profConfig;
    1539            9 :     HCCL_INFO("[%s]Set profConfig[%x]", __func__, profConfig);
    1540            9 : }
    1541              : 
    1542          392 : HcclResult ParseTaskExceptionSwitch()
    1543              : {
    1544              :     // task_exception_handler调测开关,默认关闭 (0)
    1545          392 :     std::string taskExceptionSwitchEnv = GET_ENV(MM_ENV_HCCL_DIAGNOSE_ENABLE);
    1546          392 :     if (taskExceptionSwitchEnv == "EmptyString") {
    1547          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_DIAGNOSE_ENABLE set by default to [0]");
    1548          392 :         return HCCL_SUCCESS;
    1549              :     }
    1550            0 :     u32 taskExceptionSwitchConfig = 0;
    1551            0 :     bool isEnvLenValid = CheckEnvLen(taskExceptionSwitchEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1552            0 :     CHK_PRT_RET(
    1553              :         !isEnvLenValid,
    1554              :         HCCL_ERROR(
    1555              :             "[Parse][TaskExceptionSwitch]errNo[0x%016llx] Invalid"
    1556              :             " HCCL_DIAGNOSE_ENABLE env len, len is bigger than [%u]. errorno[%d]",
    1557              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1558              :         HCCL_E_PARA);
    1559            0 :     CHK_RET(IsAllDigit(taskExceptionSwitchEnv.c_str()));
    1560            0 :     CHK_RET(SalStrToULong(taskExceptionSwitchEnv.c_str(), HCCL_BASE_DECIMAL, taskExceptionSwitchConfig));
    1561            0 :     if ((taskExceptionSwitchConfig != 0) && (taskExceptionSwitchConfig != 1)) {
    1562            0 :         HCCL_ERROR(
    1563              :             "[Get][TaskExceptionSwitch]environmental digit variable error, taskExceptionSwitchConfig[%u]",
    1564              :             taskExceptionSwitchConfig);
    1565            0 :         return HCCL_E_PARA;
    1566              :     }
    1567            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_DIAGNOSE_ENABLE set by environment to [%u]", taskExceptionSwitchConfig);
    1568            0 :     g_externalInput.taskExceptionSwitch = taskExceptionSwitchConfig;
    1569            0 :     return HCCL_SUCCESS;
    1570          392 : }
    1571              : 
    1572          392 : HcclResult ParseRdmaQpsPerConnection()
    1573              : {
    1574          392 :     g_externalInput.qpsPerConnection = HCCL_QPS_PER_CONNECTION_DEFAULT;
    1575          392 :     std::string rdmaQpsPerConnectionEnv = GET_ENV(MM_ENV_HCCL_RDMA_QPS_PER_CONNECTION);
    1576          392 :     if (rdmaQpsPerConnectionEnv == "EmptyString") {
    1577          390 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_QPS_PER_CONNECTION is set to default value [1]");
    1578          390 :         return HCCL_SUCCESS;
    1579              :     }
    1580              :     // 校验环境变量长度
    1581            2 :     bool isEnvLenValid = CheckEnvLen(rdmaQpsPerConnectionEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1582            2 :     CHK_PRT_RET(
    1583              :         !isEnvLenValid,
    1584              :         HCCL_ERROR(
    1585              :             "[Parse][RdmaQpsPerConnectionEnv]errNo[0x%016llx] Invalid RdmaQpsPerConnectionEnv env len,"
    1586              :             "len is bigger than [%u]. errorno[%d]",
    1587              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1588              :         HCCL_E_PARA);
    1589              : 
    1590            2 :     u32 qpsPerConnection = HCCL_QPS_PER_CONNECTION_DEFAULT;
    1591            2 :     CHK_RET(IsAllDigit(rdmaQpsPerConnectionEnv.c_str()));
    1592            2 :     HcclResult ret = SalStrToULong(rdmaQpsPerConnectionEnv, HCCL_BASE_DECIMAL, qpsPerConnection);
    1593            2 :     if (ret != HCCL_SUCCESS || (qpsPerConnection < HCCL_QPS_PER_CONNECTION_DEFAULT)
    1594            2 :         || (qpsPerConnection > HCCL_QPS_PER_CONNECTION_MAX)) {
    1595            0 :         HCCL_ERROR(
    1596              :             "[Parse][RdmaQpsPerConnectionEnv]environmental variable HCCL_RDMA_QPS_PER_CONNECTION error,"
    1597              :             "errNo[0x%016llx] qpsPerConnection[%s] Range[%u, %u] Recommended Range[1, 8]",
    1598              :             HCOM_ERROR_CODE(ret), rdmaQpsPerConnectionEnv.c_str(), HCCL_QPS_PER_CONNECTION_DEFAULT,
    1599              :             HCCL_QPS_PER_CONNECTION_MAX);
    1600            0 :         g_externalInput.qpsPerConnection = HCCL_QPS_PER_CONNECTION_DEFAULT;
    1601            0 :         return HCCL_E_PARA;
    1602              :     }
    1603            2 :     g_externalInput.qpsPerConnection = qpsPerConnection;
    1604            2 :     HCCL_RUN_INFO("[HCCL_ENV] environmental variable HCCL_RDMA_QPS_PER_CONNECTION is set to [%d]", qpsPerConnection);
    1605            2 :     return HCCL_SUCCESS;
    1606          392 : }
    1607              : 
    1608          392 : HcclResult ParseMultiQpThreshold()
    1609              : {
    1610          392 :     g_externalInput.multiQpThreshold = HCCL_MULTI_QP_THRESHOLD_DEFAULT;
    1611          392 :     std::string strMultiQpThresholdEnv = GET_ENV(MM_ENV_HCCL_MULTI_QP_THRESHOLD);
    1612          392 :     if (strMultiQpThresholdEnv == "EmptyString") {
    1613          392 :         HCCL_RUN_INFO(
    1614              :             "[HCCL_ENV] HCCL_MULTI_QP_THRESHOLD is set to default value [%u]KB", HCCL_MULTI_QP_THRESHOLD_DEFAULT);
    1615          392 :         return HCCL_SUCCESS;
    1616              :     }
    1617              :     // 校验环境变量长度
    1618            0 :     bool isEnvLenValid = CheckEnvLen(strMultiQpThresholdEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
    1619            0 :     CHK_PRT_RET(
    1620              :         !isEnvLenValid,
    1621              :         HCCL_ERROR(
    1622              :             "[Parse][MultiQpThresholdEnv]errNo[0x%016llx] Invalid MultiQpThresholdEnv env len,"
    1623              :             "len is bigger than [%u]. errorno[%d]",
    1624              :             HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
    1625              :         HCCL_E_PARA);
    1626              : 
    1627            0 :     u32 multiQpThreshold = HCCL_MULTI_QP_THRESHOLD_DEFAULT;
    1628            0 :     CHK_RET(IsAllDigit(strMultiQpThresholdEnv.c_str()));
    1629            0 :     HcclResult ret = SalStrToULong(strMultiQpThresholdEnv, HCCL_BASE_DECIMAL, multiQpThreshold);
    1630            0 :     if (ret != HCCL_SUCCESS || multiQpThreshold == 0 || multiQpThreshold > HCCL_MULTI_QP_THRESHOLD_MAX) {
    1631            0 :         HCCL_ERROR(
    1632              :             "[Parse][MultiQpThresholdEnv]environmental variable HCCL_MULTI_QP_THRESHOLD error,"
    1633              :             "errNo[0x%016llx] multiQpThreshold[%s] Range[1, %u]",
    1634              :             HCOM_ERROR_CODE(ret), strMultiQpThresholdEnv.c_str(), HCCL_MULTI_QP_THRESHOLD_MAX);
    1635            0 :         g_externalInput.multiQpThreshold = HCCL_MULTI_QP_THRESHOLD_DEFAULT;
    1636            0 :         return HCCL_E_PARA;
    1637              :     }
    1638            0 :     g_externalInput.multiQpThreshold = multiQpThreshold;
    1639            0 :     HCCL_RUN_INFO("[HCCL_ENV] environmental variable HCCL_MULTI_QP_THRESHOLD is set to [%d]KB", multiQpThreshold);
    1640            0 :     return HCCL_SUCCESS;
    1641          392 : }
    1642              : 
    1643          392 : HcclResult ParseEntryLogEnable()
    1644              : {
    1645          392 :     std::string enableEntryLogEnv = GET_ENV(MM_ENV_HCCL_ENTRY_LOG_ENABLE);
    1646          392 :     if (enableEntryLogEnv == "EmptyString") {
    1647          392 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_ENTRY_LOG_ENABLE set by default to [0]");
    1648          392 :         return HCCL_SUCCESS;
    1649              :     }
    1650            0 :     if (enableEntryLogEnv != "0" && enableEntryLogEnv != "1") {
    1651            0 :         HCCL_ERROR(
    1652              :             "[Parser][EntryLogEnable]environmental variable HCCL_ENTRY_LOG_ENABLE [%s] is invalid, set by "
    1653              :             "default to [0]",
    1654              :             enableEntryLogEnv.c_str());
    1655            0 :         return HCCL_E_PARA;
    1656              :     }
    1657            0 :     g_externalInput.enableEntryLog = false;
    1658            0 :     if (enableEntryLogEnv == "1") {
    1659            0 :         g_externalInput.enableEntryLog = true;
    1660              :     }
    1661            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_ENTRY_LOG_ENABLE set by environment to [%u]", g_externalInput.enableEntryLog);
    1662            0 :     return HCCL_SUCCESS;
    1663          392 : }
    1664              : 
    1665          392 : HcclResult ParseInterLinkType()
    1666              : {
    1667          392 :     std::string interHccsDisableEnv = GET_ENV(MM_ENV_HCCL_INTER_HCCS_DISABLE);
    1668          392 :     if (interHccsDisableEnv == "EmptyString") {
    1669          379 :         HCCL_RUN_INFO(
    1670              :             "[HCCL_ENV] HCCL_INTER_HCCS_DISABLE is not set, default value is %s.",
    1671              :             g_externalInput.interHccsDisable ? "TRUE" : "FALSE");
    1672          379 :         return HCCL_SUCCESS;
    1673              :     }
    1674           13 :     std::transform(interHccsDisableEnv.begin(), interHccsDisableEnv.end(), interHccsDisableEnv.begin(), ::toupper);
    1675           13 :     if ("TRUE" == interHccsDisableEnv) {
    1676            0 :         g_externalInput.interHccsDisable = true;
    1677           13 :     } else if ("FALSE" == interHccsDisableEnv) {
    1678           13 :         g_externalInput.interHccsDisable = false;
    1679              :     } else {
    1680            0 :         HCCL_ERROR("HCCL_INTER_HCCS_DISABLE %s is invalid, expect true or false.", interHccsDisableEnv.c_str());
    1681            0 :         return HCCL_E_PARA;
    1682              :     }
    1683           13 :     HCCL_RUN_INFO(
    1684              :         "[HCCL_ENV] environmental variable HCCL_INTER_HCCS_DISABLE is set to [%s], interHccsDisable[%d]",
    1685              :         interHccsDisableEnv.c_str(), g_externalInput.interHccsDisable);
    1686           13 :     return HCCL_SUCCESS;
    1687          392 : }
    1688              : 
    1689          392 : HcclResult ParseOpExpansion()
    1690              : {
    1691          392 :     std::string opExpansionModeEnv = GET_ENV(MM_ENV_HCCL_OP_EXPANSION_MODE);
    1692          392 :     g_externalInput.aicpuUnfold = false;
    1693          392 :     g_externalInput.aivMode = false;
    1694          392 :     g_externalInput.aicpuCacheEnable = 0; // aicpu模式不使能时, aicpu cache也不使能 (即使使能也不生效)
    1695          392 :     if (IsGeneralServer()) {
    1696            0 :         HCCL_RUN_INFO(
    1697              :             "[HCCL_ENV] HCCL_OP_EXPANSION_MODE is not set, aicpuUnfold is [%u], aivMode is [%u], aicpuCacheEnable is "
    1698              :             "[%u]",
    1699              :             g_externalInput.aicpuUnfold, g_externalInput.aivMode, g_externalInput.aicpuCacheEnable);
    1700            0 :         return HCCL_SUCCESS;
    1701              :     }
    1702              : 
    1703              : #ifndef HCCD
    1704              :     DevType deviceType;
    1705          392 :     CHK_RET(hrtGetDeviceType(deviceType));
    1706              :     // 910_93默认打开AICPU展开
    1707          392 :     if (deviceType == DevType::DEV_TYPE_910_93) {
    1708            3 :         g_externalInput.aicpuUnfold = true;
    1709            3 :         g_externalInput.aicpuCacheEnable = 1; // aicpu cache默认使能
    1710              :     }
    1711          392 :     if (opExpansionModeEnv == "EmptyString") {
    1712          387 :         HCCL_RUN_INFO(
    1713              :             "[HCCL_ENV] HCCL_OP_EXPANSION_MODE is not set, aicpuUnfold is [%u], aivMode is [%u], aicpuCacheEnable is "
    1714              :             "[%u]",
    1715              :             g_externalInput.aicpuUnfold, g_externalInput.aivMode, g_externalInput.aicpuCacheEnable);
    1716          387 :         return HCCL_SUCCESS;
    1717              :     }
    1718            5 :     if (opExpansionModeEnv == "AI_CPU") {
    1719            5 :         if (deviceType == DevType::DEV_TYPE_910) {
    1720            0 :             HCCL_WARNING("910 do not support AICPU unfold.");
    1721              :         } else {
    1722            5 :             g_externalInput.aicpuUnfold = true;
    1723            5 :             g_externalInput.aicpuCacheEnable = 1; // aicpu cache默认使能
    1724              :         }
    1725            0 :     } else if (opExpansionModeEnv == "AICPU_CacheDisable") {
    1726            0 :         if (deviceType == DevType::DEV_TYPE_910) {
    1727            0 :             HCCL_WARNING("910 do not support AICPU unfold.");
    1728              :         } else {
    1729            0 :             g_externalInput.aicpuUnfold = true;
    1730            0 :             g_externalInput.aicpuCacheEnable = 0; // Disable aicpu cache
    1731              :         }
    1732            0 :     } else if (opExpansionModeEnv == "AIV") {
    1733            0 :         g_externalInput.aivMode = true;
    1734            0 :     } else if (opExpansionModeEnv == "HOST") {
    1735            0 :         g_externalInput.aivMode = false;
    1736            0 :         g_externalInput.aicpuUnfold = false;
    1737            0 :         g_externalInput.aicpuCacheEnable = 0;
    1738            0 :     } else if (opExpansionModeEnv == "HOST_TS") {
    1739            0 :         if (deviceType == DevType::DEV_TYPE_910B) {
    1740            0 :             g_externalInput.enableFfts = false;
    1741              :         } else {
    1742            0 :             HCCL_WARNING("deviceType[%u] do not support HOST_TS", deviceType);
    1743              :         }
    1744              :     } else {
    1745            0 :         HCCL_ERROR(
    1746              :             "HCCL_OP_EXPANSION_MODE is set to [%s], which is incorrect. Please check", opExpansionModeEnv.c_str());
    1747            0 :         return HCCL_E_PARA;
    1748              :     }
    1749              : #endif
    1750            5 :     HCCL_RUN_INFO(
    1751              :         "[HCCL_ENV] environmental variable HCCL_OP_EXPANSION_MODE is [%s], aicpuUnfold[%u], aivMode[%u], "
    1752              :         "enableFfts[%u], aicpuCacheEnable[%u]",
    1753              :         opExpansionModeEnv.c_str(), g_externalInput.aicpuUnfold, g_externalInput.aivMode, g_externalInput.enableFfts,
    1754              :         g_externalInput.aicpuCacheEnable);
    1755            5 :     return HCCL_SUCCESS;
    1756          392 : }
    1757              : 
    1758           60 : HcclResult SplitHcclRetryEnable(
    1759              :     [[maybe_unused]] const std::string& retryConfig, [[maybe_unused]] std::vector<std::string>& retryEnables)
    1760              : {
    1761              : #ifndef CCL_KERNEL_AICPU
    1762           60 :     std::string remainRetryConfig;
    1763           60 :     std::size_t found = retryConfig.find(",");
    1764           60 :     if ((found == 0) || (found == (retryConfig.length() - 1))) {
    1765            0 :         HCCL_ERROR("[SplitHcclRetryEnable] algo config is invalid.");
    1766            0 :         return HCCL_E_PARA;
    1767           60 :     } else if (found != std::string::npos) {
    1768           40 :         remainRetryConfig = retryConfig.substr(found + 1);
    1769              :     } else {
    1770              :         // 最后一组配置,剩余的字符串为空
    1771              :     }
    1772           60 :     retryEnables.push_back(retryConfig.substr(0, found));
    1773              : 
    1774           60 :     if (retryEnables.size() > HCCL_RETRY_ENABLE_LEVEL_NUM) {
    1775            0 :         HCCL_ERROR(
    1776              :             "[SplitHcclRetryEnable] retryEnable config is invalid. retryEnable level is more than %u.",
    1777              :             HCCL_RETRY_ENABLE_LEVEL_NUM);
    1778            0 :         return HCCL_E_PARA;
    1779              :     }
    1780           60 :     if (!remainRetryConfig.empty()) {
    1781           40 :         CHK_RET(SplitHcclRetryEnable(remainRetryConfig, retryEnables));
    1782              :     }
    1783              : #endif
    1784           60 :     return HCCL_SUCCESS;
    1785           60 : }
    1786              : 
    1787           20 : HcclResult CollectRetryEnableFromConfig([[maybe_unused]] const std::vector<std::string>& retryEnables)
    1788              : {
    1789              : #ifndef CCL_KERNEL_AICPU
    1790              :     const std::map<std::string, u32> hcclRetryLevelMap
    1791          100 :         = {{"L0", HCCL_RETRY_ENABLE_LEVEL_0}, {"L1", HCCL_RETRY_ENABLE_LEVEL_1}, {"L2", HCCL_RETRY_ENABLE_LEVEL_2}};
    1792              : 
    1793          100 :     std::map<std::string, u32> countHcclRetryLevelMap = {{"L0", 0}, {"L1", 0}, {"L2", 0}};
    1794              : 
    1795           80 :     const std::map<std::string, bool> hcclRetryEnableMap = {{"0", false}, {"1", true}};
    1796           80 :     for (auto retryEnableLevel : retryEnables) {
    1797           60 :         u32 level = 0;
    1798           60 :         bool retryEnable = false;
    1799           60 :         std::size_t found = retryEnableLevel.find(":");
    1800           60 :         if ((found == 0) || (found == (retryEnableLevel.length() - 1))) {
    1801            0 :             HCCL_ERROR("[CollectRetryEnableFromConfig] Hccl retryEnableLevel is invalid.");
    1802            0 :             return HCCL_E_PARA;
    1803              :         }
    1804           60 :         std::string orginalLevel = retryEnableLevel.substr(0, found);
    1805           60 :         std::string orginalRetryEnable = retryEnableLevel.substr(found + 1);
    1806           60 :         if (orginalLevel == "L0") {
    1807           20 :             HCCL_RUN_WARNING("[CollectRetryEnableFromConfig] L0 config does not take effect");
    1808              :         }
    1809              :         // 检查是否存在重复配置level
    1810           60 :         auto iterCountRetryLevel = countHcclRetryLevelMap.find(orginalLevel);
    1811           60 :         if (iterCountRetryLevel == countHcclRetryLevelMap.end()) {
    1812            0 :             HCCL_ERROR(
    1813              :                 "[CollectRetryEnableFromConfig] Retry config is invalid, level %s is not supported.",
    1814              :                 orginalLevel.c_str());
    1815            0 :             return HCCL_E_PARA;
    1816              :         }
    1817           60 :         if (countHcclRetryLevelMap[orginalLevel] == 1) {
    1818            0 :             HCCL_ERROR(
    1819              :                 "[CollectRetryEnableFromConfig] Retry config level[%s] is repeated, expect: L1:0, L2:0",
    1820              :                 orginalLevel.c_str());
    1821            0 :             return HCCL_E_PARA;
    1822              :         }
    1823           60 :         countHcclRetryLevelMap[orginalLevel] += 1;
    1824              :         // 获取level和对应的retryEnable,并赋值给g_externalInput.hcclRetryConfig
    1825           60 :         auto iterRetryLevel = hcclRetryLevelMap.find(orginalLevel);
    1826           60 :         if (iterRetryLevel == hcclRetryLevelMap.end()) {
    1827            0 :             HCCL_ERROR(
    1828              :                 "[CollectRetryEnableFromConfig] Retry config is invalid, level %s is not supported.",
    1829              :                 orginalLevel.c_str());
    1830            0 :             return HCCL_E_PARA;
    1831              :         }
    1832           60 :         auto iterRetryEnable = hcclRetryEnableMap.find(orginalRetryEnable);
    1833           60 :         if (iterRetryEnable == hcclRetryEnableMap.end()) {
    1834            0 :             HCCL_ERROR(
    1835              :                 "[CollectRetryEnableFromConfig] Retry config is invalid, retryEnable %s is not supported.",
    1836              :                 orginalRetryEnable.c_str());
    1837            0 :             return HCCL_E_PARA;
    1838              :         }
    1839           60 :         level = iterRetryLevel->second;
    1840           60 :         retryEnable = iterRetryEnable->second;
    1841           60 :         g_externalInput.hcclRetryConfig[level] = retryEnable;
    1842           60 :     }
    1843              : #endif
    1844           20 :     return HCCL_SUCCESS;
    1845          100 : }
    1846              : 
    1847          392 : HcclResult ParseRetryEnable()
    1848              : {
    1849              : #ifndef CCL_KERNEL_AICPU
    1850              :     // 默认都设置成false
    1851         1568 :     for (u32 level = 0; level < HCCL_RETRY_ENABLE_LEVEL_NUM; ++level) {
    1852         1176 :         g_externalInput.hcclRetryConfig[level] = false;
    1853              :     }
    1854          392 :     std::string hcclRetryEnable = GET_ENV(MM_ENV_HCCL_OP_RETRY_ENABLE);
    1855          392 :     if (hcclRetryEnable == "EmptyString") {
    1856          372 :         HCCL_RUN_INFO("[HCCL_ENV][ParseRetryEnable] HCCL_OP_RETRY_ENABLE is not set. The retryEnable of all levels is "
    1857              :                       "set to false.");
    1858          372 :         return HCCL_SUCCESS;
    1859              :     }
    1860              :     // 去除空格
    1861           20 :     std::string retryConfig = hcclRetryEnable;
    1862           20 :     retryConfig.erase(std::remove(retryConfig.begin(), retryConfig.end(), ' '), retryConfig.end());
    1863              : 
    1864           20 :     if (retryConfig.empty()) {
    1865            0 :         HCCL_RUN_INFO(
    1866              :             "[HCCL_ENV][ParseRetryEnable] Hccl retry config is empty. The retryEnable of all levels is set to false.");
    1867            0 :         return HCCL_SUCCESS;
    1868              :     }
    1869              : 
    1870           20 :     std::vector<std::string> retryEnables;
    1871           20 :     HcclResult ret = SplitHcclRetryEnable(retryConfig, retryEnables);
    1872           20 :     CHK_PRT_RET(
    1873              :         ret != HCCL_SUCCESS,
    1874              :         HCCL_ERROR(
    1875              :             "[CollectRetryEnableFromConfig] Hccl retry config[%s] is invalid. "
    1876              :             "expect: L1:0, L2:0",
    1877              :             retryConfig.c_str()),
    1878              :         ret);
    1879              : 
    1880           20 :     CHK_RET(CollectRetryEnableFromConfig(retryEnables));
    1881           20 :     HCCL_RUN_INFO(
    1882              :         "[HCCL_ENV][ParseRetryEnable] HCCL_OP_RETRY_ENABLE set by environment variable to [%s].", retryConfig.c_str());
    1883              : #endif
    1884           20 :     return HCCL_SUCCESS;
    1885          392 : }
    1886              : 
    1887          392 : HcclResult ParseRetryParams()
    1888              : {
    1889              : #ifndef CCL_KERNEL_AICPU
    1890          392 :     std::string retryParams = GET_ENV(MM_ENV_HCCL_OP_RETRY_PARAMS);
    1891          392 :     if (retryParams == "EmptyString") {
    1892          392 :         HCCL_RUN_INFO(
    1893              :             "[HCCL_ENV] HCCL_OP_RETRY_PARAMS is not set, default value MaxCnt is [%u], HoldTime is [%u]ms, "
    1894              :             "IntervalTime is [%u]ms",
    1895              :             HCCL_RETRY_MAXCNT_DEFAULT, HCCL_RETRY_HOLD_TIME_DEFAULT, HCCL_RETRY_INTERVAL_DEFAULT);
    1896          392 :         return HCCL_SUCCESS;
    1897              :     }
    1898            0 :     u32 maxcnt = 0;
    1899            0 :     u32 holdtime = 0;
    1900            0 :     u32 intervaltime = 0;
    1901            0 :     int ret = 0;
    1902            0 :     ret = sscanf_s(retryParams.c_str(), "MaxCnt:%u, HoldTime:%u, IntervalTime:%u", &maxcnt, &holdtime, &intervaltime);
    1903              :     /* 三个参数全部解析成功,返回值为3,否则不等于3 */
    1904            0 :     if ((ret != 3) || (maxcnt > HCCL_RETRY_MAXCNT_MAX) || (maxcnt < HCCL_RETRY_MAXCNT_MIN)
    1905            0 :         || (holdtime > HCCL_RETRY_HLOD_TIME_MAX) || (intervaltime > HCCL_RETRY_INTERVAL_MAX)) {
    1906            0 :         HCCL_ERROR(
    1907              :             "[Parse][RetryParams]fail, HCCL_OP_RETRY_PARAMS: %s is invalid, format must be: "
    1908              :             "MaxCnt:cnt,HoldTime:time,IntervalTime:time, cnt range is [1, 10], time range is [0, 60000]ms.",
    1909              :             retryParams.c_str());
    1910            0 :         return HCCL_E_PARA;
    1911              :     }
    1912            0 :     g_externalInput.retryMaxCnt = maxcnt;
    1913            0 :     g_externalInput.retryHoldTime = holdtime;
    1914            0 :     g_externalInput.retryIntervalTime = intervaltime;
    1915              : 
    1916            0 :     HCCL_RUN_INFO(
    1917              :         "[HCCL_ENV] HCCL_OP_RETRY_PARAMS is set, MaxCnt is [%u], HoldTime is [%u]ms, IntervalTime is [%u]ms.", maxcnt,
    1918              :         holdtime, intervaltime);
    1919              : #endif
    1920            0 :     return HCCL_SUCCESS;
    1921          392 : }
    1922              : 
    1923          392 : HcclResult ParseLogicSuperPodId()
    1924              : {
    1925          392 :     std::string logicSuperPodId = GET_ENV(MM_ENV_HCCL_LOGIC_SUPERPOD_ID);
    1926          392 :     if (logicSuperPodId == "EmptyString") {
    1927          392 :         HCCL_RUN_INFO(
    1928              :             "[HCCL_ENV] HCCL_LOGIC_SUPERPOD_ID is not set, default value[%s]", g_externalInput.logicSuperPodId.c_str());
    1929          392 :         return HCCL_SUCCESS;
    1930              :     }
    1931              : 
    1932              :     // 校验环境变量长度
    1933            0 :     bool isEnvLenValid = CheckEnvLen(logicSuperPodId.c_str(), MAX_LEN_OF_LOGIC_SUPER_ID);
    1934            0 :     CHK_PRT_RET(
    1935              :         !isEnvLenValid,
    1936              :         HCCL_ERROR(
    1937              :             "[Parse][LogicSuperPodId]Invalid HCCL_LOGIC_SUPERPOD_ID env len, len is bigger than [%u].",
    1938              :             MAX_LEN_OF_LOGIC_SUPER_ID),
    1939              :         HCCL_E_PARA);
    1940              : 
    1941            0 :     g_externalInput.logicSuperPodId = logicSuperPodId;
    1942            0 :     HCCL_RUN_INFO(
    1943              :         "[HCCL_ENV] HCCL_LOGIC_SUPERPOD_ID set by environment to [%s]", g_externalInput.logicSuperPodId.c_str());
    1944            0 :     return HCCL_SUCCESS;
    1945          392 : }
    1946              : 
    1947            0 : HcclResult SetIncreSaveExecTimeOut(const s32 execTimeout)
    1948              : {
    1949            0 :     if (execTimeout == -1) {
    1950            0 :         g_externalInput.increSaveExecTimeOut = execTimeout;
    1951              :     } else {
    1952            0 :         g_externalInput.increSaveExecTimeOut = g_externalInput.execTimeOut;
    1953              :     }
    1954              : 
    1955            0 :     HCCL_RUN_INFO(
    1956              :         "setIncreSaveExecTimeOut execTimeout[%d s] increSaveExecTimeOut[%d s]", execTimeout,
    1957              :         g_externalInput.increSaveExecTimeOut);
    1958            0 :     return HCCL_SUCCESS;
    1959              : }
    1960              : 
    1961          392 : HcclResult ParseDebugConfig()
    1962              : {
    1963          392 :     char* env = nullptr; // 环境变量值
    1964          392 :     MM_SYS_GET_ENV(MM_ENV_HCCL_DEBUG_CONFIG, env);
    1965          392 :     if (env == nullptr) {
    1966          133 :         HCCL_RUN_INFO(
    1967              :             "[HCCL_ENV] HCCL_DEBUG_CONFIG is not set, debugConfig set by default to 0x%llx",
    1968              :             g_externalInput.debugConfig);
    1969          133 :         return HCCL_SUCCESS;
    1970              :     }
    1971              : 
    1972          259 :     bool invert = (env[0] == '^');
    1973              :     g_externalInput.debugConfig
    1974          259 :         = invert ? ~0ULL : 0ULL; // 第一个字符是'^', 使用取反模式,用户配置的项关闭,未配置的项打开
    1975          259 :     char* configValue = (env[0] == '^') ? env + 1 : env; // 去掉'^'符号
    1976          259 :     char* configDup = strdup(configValue);               // 需要使用strdup避免修改字符串常量
    1977          259 :     CHK_PTR_NULL(configDup);
    1978              : 
    1979          259 :     char* left = nullptr;
    1980          259 :     char* subConfig = strtok_r(configDup, ",", &left); // 按逗号分割
    1981          518 :     while (subConfig != nullptr) {
    1982          259 :         u64 mask = 0;
    1983          259 :         if (strcasecmp(subConfig, "ALG") == 0) {
    1984          239 :             mask = PLF_ALG;
    1985           20 :         } else if (strcasecmp(subConfig, "TASK") == 0) {
    1986            0 :             mask = PLF_TASK;
    1987           20 :         } else if (strcasecmp(subConfig, "RESOURCE") == 0) {
    1988            0 :             mask = PLF_RES;
    1989           20 :         } else if (strcasecmp(subConfig, "AIV_OPS_EXC") == 0) {
    1990           20 :             HCCL_WARNING("HCCL_DEBUG_CONFIG:%s subConfig:%s is deprecated and ignored", env, subConfig);
    1991              :         } else {
    1992            0 :             HCCL_ERROR("HCCL_DEBUG_CONFIG:%s is invalid, subConfig:%s is not supported", env, subConfig);
    1993            0 :             free(configDup);
    1994            0 :             return HCCL_E_PARA;
    1995              :         }
    1996              :         g_externalInput.debugConfig
    1997          259 :             = invert ? (g_externalInput.debugConfig & (~mask)) : (g_externalInput.debugConfig | mask);
    1998          259 :         subConfig = strtok_r(nullptr, ",", &left);
    1999              :     }
    2000          259 :     free(configDup);
    2001          259 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_DEBUG_CONFIG[%s], set debugConfig[0x%llx]", env, g_externalInput.debugConfig);
    2002          259 :     return HCCL_SUCCESS;
    2003              : }
    2004              : 
    2005           19 : const u32& GetExternalInputHcclIfBasePort() { return g_externalInput.hcclIfBasePort; }
    2006              : 
    2007            0 : const u32& GetExternalInputRdmaTrafficClass() { return g_externalInput.rdmaTrafficClass; }
    2008              : 
    2009            0 : const u32& GetExternalInputRdmaServerLevel() { return g_externalInput.rdmaServerLevel; }
    2010              : 
    2011            7 : const u32& GetExternalInputRdmaTimeOut() { return g_externalInput.rdmaTimeOut; }
    2012              : 
    2013            4 : const u32& GetExternalInputRdmaRetryCnt() { return g_externalInput.rdmaRetryCnt; }
    2014              : 
    2015           96 : const u32& GetExternalInputTaskExceptionSwitch() { return g_externalInput.taskExceptionSwitch; }
    2016              : 
    2017          891 : const u32& GetExternalInputIntraRoceSwitch() { return g_externalInput.intraRoceSwitch; }
    2018              : 
    2019          296 : const u32& GetExternalInputHcclEnableWhitelist() { return g_externalInput.enableWhitelist; }
    2020              : 
    2021            9 : const std::string& GetExternalInputHcclWhiteListFile() { return g_externalInput.hcclWhiteListFile; }
    2022              : 
    2023            0 : const std::string& GetExternalInputProfilingOption() { return g_externalInput.profilingOption; }
    2024              : 
    2025          236 : const std::string& GetExternalInputCannVersion() { return g_externalInput.cannVersion; }
    2026              : 
    2027         3892 : const double& GetExternalInputHcclExecTimeOut() { return g_externalInput.execTimeOut; }
    2028              : 
    2029          341 : const s32& GetExternalInputHcclLinkTimeOut() { return g_externalInput.linkTimeOut; }
    2030              : 
    2031           13 : const s32& GetExternalInputHcclSocketFamily() { return g_externalInput.hcclSocketFamily; }
    2032              : 
    2033          491 : const bool& GetExternalInputProfilingMode() { return g_externalInput.profilingMode; }
    2034              : 
    2035         1288 : const bool& GetExternalInputHcclIsTcpMode() { return g_externalInput.isTcpMode; }
    2036              : 
    2037          706 : const bool& GetExternalInputHcclDumpDebug() { return g_externalInput.dumpDebug; }
    2038              : 
    2039         2226 : const bool& GetExternalInputHcclEnableFfts() { return g_externalInput.enableFfts; }
    2040              : 
    2041         3788 : const u8& GetExternalInputHcclDeterministicV2() { return g_externalInput.hcclDeterministic; }
    2042              : 
    2043            0 : const bool& GetExternalInputHcclDeterministic()
    2044              : {
    2045            0 :     g_externalInput.isDeterministic = g_externalInput.hcclDeterministic == DETERMINISTIC_ENABLE;
    2046            0 :     return g_externalInput.isDeterministic;
    2047              : }
    2048              : 
    2049          150 : const bool& GetExternalInputHcclEnablePipline() { return g_externalInput.enablePipline; }
    2050              : 
    2051           29 : const bool& GetExternalInputHcclEnableEntryLog() { return g_externalInput.enableEntryLog; }
    2052              : 
    2053          462 : const bool& GetExternalInputInterHccsDisable() { return g_externalInput.interHccsDisable; }
    2054              : 
    2055         2761 : const u64& GetExternalInputCCLBuffSize() { return g_externalInput.cclBufferSize; }
    2056              : 
    2057          611 : const HcclExecTimeoutSet& GetExternalInputHcclExecTimeoutSet() { return g_externalInput.execTimeOutSet; }
    2058              : 
    2059           16 : const hccl::HcclIpAddress& GetExternalInputHcclControlIfIp() { return g_externalInput.hcclControlIfIp; }
    2060              : 
    2061           21 : const HcclSocketIfName& GetExternalInputHcclSocketIfName() { return g_externalInput.hcclSocketIfName; }
    2062              : 
    2063            0 : u32 GetExternalInputQpsPerConnection() { return g_externalInput.qpsPerConnection; }
    2064              : 
    2065            0 : u32 GetExternalInputMultiQpThreshold() { return g_externalInput.multiQpThreshold; }
    2066              : 
    2067         1494 : const ProtocolType& GetExternalInputProtocolType() { return g_externalInput.protocolType; }
    2068              : 
    2069           13 : const MasterInfo& GetExternalInputMasterInfo() { return g_externalInput.masterInfo; }
    2070              : 
    2071         3266 : const bool& GetExternalInputHcclAicpuUnfold() { return g_externalInput.aicpuUnfold; }
    2072              : 
    2073          176 : const uint8_t& GetExternalInputAicpuCacheEnable() { return g_externalInput.aicpuCacheEnable; }
    2074              : 
    2075         3324 : const bool& GetExternalInputHcclAivMode() { return g_externalInput.aivMode; }
    2076              : 
    2077          228 : const bool& GetRemoteIsHdc() { return g_externalInput.remoteIsHdc; }
    2078              : 
    2079         2739 : const bool& GetExternalInputIntraServerRetryEnable()
    2080              : {
    2081         2739 :     return g_externalInput.hcclRetryConfig[HCCL_RETRY_ENABLE_LEVEL_0];
    2082              : }
    2083              : 
    2084         2739 : const bool& GetExternalInputInterServerRetryEnable()
    2085              : {
    2086         2739 :     return g_externalInput.hcclRetryConfig[HCCL_RETRY_ENABLE_LEVEL_1];
    2087              : }
    2088              : 
    2089         2930 : const bool& GetExternalInputInterSuperPodRetryEnable()
    2090              : {
    2091         2930 :     return g_externalInput.hcclRetryConfig[HCCL_RETRY_ENABLE_LEVEL_2];
    2092              : }
    2093              : 
    2094            0 : const bool& GetExternalInputOpCounter() { return g_externalInput.opCounterEnable; }
    2095              : 
    2096         2739 : const u32& GetExternalInputRetryMaxCnt() { return g_externalInput.retryMaxCnt; }
    2097              : 
    2098         2745 : const u32& GetExternalInputRetryHoldTime() { return g_externalInput.retryHoldTime; }
    2099              : 
    2100         2744 : const u32& GetExternalInputRetryIntervalTime() { return g_externalInput.retryIntervalTime; }
    2101              : 
    2102            2 : const std::string& GetExternalInputLogicSuperPodId() { return g_externalInput.logicSuperPodId; }
    2103              : 
    2104           34 : const bool& GetExternalInputRdmaFastPost() { return g_externalInput.rdmaFastPost; }
    2105              : 
    2106            0 : const std::string& GetExternalInputQpSrcPortConfigPath() { return g_externalInput.multiQpSrcPortConfigPath; }
    2107              : 
    2108            0 : const s32& GetIncreSaveExecTimeOut() { return g_externalInput.increSaveExecTimeOut; }
    2109              : 
    2110            0 : const u64& GetProfConfig() { return g_externalInput.profConfig; }
    2111              : 
    2112        17217 : const u64& GetExternalInputDebugConfig() { return g_externalInput.debugConfig; }
    2113              : 
    2114           11 : void SetExternalInputDebugConfig(u64 value) { g_externalInput.debugConfig = value; }
        

Generated by: LCOV version 2.0-1