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

Generated by: LCOV version 2.0-1