LCOV - code coverage report
Current view: top level - coll_communicator_mgr/dfx/taskException/host - hcclCommTaskException.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 36.3 % 460 167
Test Date: 2026-08-29 17:38:31 Functions: 50.0 % 38 19

            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 "hcclCommTaskException.h"
      12              : #include <memory>
      13              : #include "log.h"
      14              : #include "coll_comm.h"
      15              : #include "acl/acl_rt.h"
      16              : #include "orion_adapter_hccp.h"
      17              : #include "hcomm_adapter_hccp.h"
      18              : #include <adapter_error_manager_pub.h>
      19              : #include "op_type.h"
      20              : #include "task_exception_handler.h"
      21              : #include "ccuTaskException.h"
      22              : #include "hccl_types.h"
      23              : #include "dpu_kernel_entrance.h"
      24              : 
      25              : namespace hcomm {
      26              : 
      27              : using namespace std;
      28              : 
      29              : constexpr u32 MAX_MODULE_DEVICE_NUM_V2 = 65;
      30              : constexpr uint32_t TASK_CONTEXT_SIZE = 50;
      31              : constexpr uint32_t TASK_CONTEXT_INFO_SIZE = LOG_TMPBUF_SIZE - 50; // task 执行失败时打印前序task信息的长度限制
      32              : 
      33              : // Leaky Singleton: 故意不释放,规避 Static Destruction Order Fiasco,
      34              : // 确保 RTS 回调访问 handlers_ 时内存仍有效
      35              : static TaskExceptionHost* handlers_ = new TaskExceptionHost[MAX_MODULE_DEVICE_NUM_V2];
      36              : GetAicpuCqeErrInfoCallBackHcomm g_getAicpuCqeErrInfoCallBack = nullptr;
      37              : AicpuGetErrStatusVecCallBack g_AicpuGetErrStatusVecCallBack = nullptr;
      38              : 
      39           52 : void RegisterGetAicpuCqeErrInfoCallBackHcomm(GetAicpuCqeErrInfoCallBackHcomm p1)
      40              : {
      41           52 :     g_getAicpuCqeErrInfoCallBack = p1;
      42           52 :     return;
      43              : }
      44              : 
      45            0 : void TaskExceptionHost::ClusterMoniterGetAicpuCqeErrInfo(
      46              :     u32 remoteLocalId, u32 locDeviceId, uint16_t status, string localEid, string remoteEid, string remoteInsId) const
      47              : {
      48            0 :     if (g_getAicpuCqeErrInfoCallBack != nullptr) {
      49            0 :         g_getAicpuCqeErrInfoCallBack(remoteLocalId, locDeviceId, status, localEid, remoteEid, remoteInsId);
      50              :     } else {
      51            0 :         HCCL_RUN_WARNING("[%s]g_getAicpuCqeErrInfoCallBack is nullptr.", __func__);
      52              :     }
      53            0 :     return;
      54              : }
      55              : 
      56           52 : void RegisterAicpuGetErrStatusVecCallBack(AicpuGetErrStatusVecCallBack p1)
      57              : {
      58           52 :     g_AicpuGetErrStatusVecCallBack = p1;
      59           52 :     return;
      60              : }
      61              : 
      62            4 : std::vector<std::string> AicpuGetErrStatusVec(s32 deviceLogicID)
      63              : {
      64            4 :     if (g_AicpuGetErrStatusVecCallBack != nullptr) {
      65            4 :         return g_AicpuGetErrStatusVecCallBack(deviceLogicID);
      66              :     } else {
      67            0 :         HCCL_RUN_WARNING("[AicpuGetErrStatusVec]g_AicpuGetErrStatusVecCallBack is nullptr.");
      68              :     }
      69            0 :     return std::vector<std::string>();
      70              : }
      71              : 
      72            4 : std::string AicpuGetAndPrintClusterMonitorErr(const rtExceptionInfo* exceptionInfo)
      73              : {
      74            4 :     auto errStatusVec = AicpuGetErrStatusVec(exceptionInfo->deviceid);
      75            4 :     std::string errMsg = "";
      76            4 :     int errSize = errStatusVec.size();
      77            4 :     if (errSize > 0) {
      78            0 :         int maxListSize = 3; // 放入errMsg中的异常事件最多只有3个
      79            0 :         if (errSize <= maxListSize) {
      80            0 :             errMsg = "\nthere are(is) " + std::to_string(errSize) + " abnormal device(s):\n";
      81              :         } else {
      82            0 :             errMsg = "\nthere are " + std::to_string(errSize) + " abnormal device(s), "
      83            0 :                      + "only the first 3 devices are listed:\n";
      84              :         }
      85              : 
      86            0 :         for (int i = 0; i < errSize; i++) {
      87            0 :             HCCL_ERROR("%s", errStatusVec[i].c_str());
      88            0 :             if (i < maxListSize) {
      89            0 :                 errMsg += ("\t" + errStatusVec[i] + "\n");
      90              :             }
      91              :         }
      92              :     }
      93            4 :     return errMsg;
      94            4 : }
      95              : 
      96          384 : TaskExceptionHost* TaskExceptionHost::GetInstance(s32 deviceLogicID)
      97              : {
      98          384 :     if (deviceLogicID < 0 || static_cast<u32>(deviceLogicID) >= MAX_MODULE_DEVICE_NUM_V2) {
      99            0 :         HCCL_ERROR("[TaskExceptionHost][GetInstance] deviceLogicID[%d] is invalid", deviceLogicID);
     100            0 :         return nullptr;
     101              :     }
     102          384 :     return &handlers_[deviceLogicID];
     103              : }
     104              : 
     105            0 : TaskExceptionHost::~TaskExceptionHost()
     106              : {
     107            0 :     std::unique_lock<std::mutex> lock(taskExceptionMutex_);
     108            0 :     if (!CommRegisterMap_.empty()) {
     109            0 :         CommRegisterMap_.clear();
     110            0 :         aclError ret = aclrtExceptionInfoCallbackUnregister(ProcessCallback); // 注销注册给rts的TaskException回调
     111            0 :         HCCL_RUN_INFO("[%s]aclrtExceptionInfoCallbackUnregister, ret[%d]", __func__, ret);
     112              :     }
     113            0 : }
     114              : 
     115            1 : void TaskExceptionHost::ProcessCallback(rtExceptionInfo_t* exceptionInfo)
     116              : {
     117            1 :     CHK_PRT_RET(exceptionInfo == nullptr, HCCL_ERROR("[%s]fail, exceptionInfo is nullptr", __func__), );
     118              : 
     119            0 :     TaskExceptionHost* handler = TaskExceptionHost::GetInstance(exceptionInfo->deviceid);
     120            0 :     CHK_PRT_RET(handler == nullptr, HCCL_ERROR("[%s]fail, TaskExceptionHost is nullptr", __func__), );
     121            0 :     handler->Process(exceptionInfo);
     122              : }
     123              : 
     124          165 : HcclResult TaskExceptionHost::Register(u64 commHandle)
     125              : {
     126          165 :     std::unique_lock<std::mutex> lock(taskExceptionMutex_);
     127          165 :     if (CommRegisterMap_.empty()) {
     128          164 :         aclError ret = aclrtExceptionInfoCallbackRegister(ProcessCallback);
     129          164 :         CHK_PRT_RET(
     130              :             ret != ACL_SUCCESS, HCCL_ERROR("[%s]aclrtExceptionInfoCallbackRegister failed, ret[%d]", __func__, ret),
     131              :             HCCL_E_RUNTIME);
     132          164 :         Hccl::HrtUnregTaskExceptionCallbackByModule(Hccl::TaskExceptionHandler::Process);
     133          164 :         HCCL_RUN_INFO(
     134              :             "[%s]aclrtExceptionInfoCallbackRegister set ProcessCallback success and unregister legacy "
     135              :             "TaskExceptionHandler::Process callback",
     136              :             __func__);
     137              :     }
     138              : 
     139          165 :     CommRegisterMap_.insert(commHandle);
     140          165 :     HCCL_INFO("[%s]success, commHandle[0x%llx]", __func__, commHandle);
     141          165 :     return HCCL_SUCCESS;
     142          165 : }
     143              : 
     144          205 : HcclResult TaskExceptionHost::UnRegister(u64 commHandle)
     145              : {
     146          205 :     std::unique_lock<std::mutex> lock(taskExceptionMutex_);
     147          205 :     if (CommRegisterMap_.find(commHandle) == CommRegisterMap_.end()) {
     148           41 :         HCCL_INFO("[%s] commHandle[0x%llx] has not registered, skip", __func__, commHandle);
     149           41 :         return HCCL_SUCCESS;
     150              :     }
     151              : 
     152          164 :     CommRegisterMap_.erase(commHandle);
     153          164 :     if (CommRegisterMap_.empty()) {
     154          163 :         aclError ret = aclrtExceptionInfoCallbackUnregister(ProcessCallback); // 注销注册给rts的TaskException回调
     155          163 :         CHK_PRT_RET(
     156              :             ret != ACL_SUCCESS, HCCL_ERROR("[%s]aclrtExceptionInfoCallbackUnregister failed, ret[%d]", __func__, ret),
     157              :             HCCL_E_RUNTIME);
     158          163 :         HCCL_RUN_INFO("[%s]aclrtExceptionInfoCallbackUnregister success", __func__);
     159              :     }
     160              : 
     161          164 :     HCCL_INFO("[%s]success, commHandle[0x%llx]", __func__, commHandle);
     162          164 :     return HCCL_SUCCESS;
     163          205 : }
     164              : 
     165            0 : HcclResult TaskExceptionHost::PrintUbRegisters(s32 devLogicId, const RdmaHandle rdmaHandle) const
     166              : {
     167            0 :     HCCL_INFO("[PrintUbRegister] start, devLogicId[%d], rdmaHandle[%p]", devLogicId, rdmaHandle);
     168            0 :     Hccl::AuxInfoIn in;
     169            0 :     in.cqe.status = 0xffffffff; // 0xffffffff代表查询所有寄存器
     170            0 :     in.auxInfoInType = Hccl::AuxInfoInType::AUX_INFO_IN_TYPE_CQE;
     171            0 :     in.cqe.sR = 0;
     172            0 :     Hccl::AuxInfoOut auxInfo;
     173            0 :     auto ret = Hccl::RaGetAuxInfo(rdmaHandle, in, auxInfo);
     174            0 :     if (ret != HCCL_SUCCESS) {
     175            0 :         HCCL_ERROR("[PrintUbRegister]GetUbRegisterInfo failed, devLogicId[%d], rdmaHandle[%p]", devLogicId, rdmaHandle);
     176            0 :         return ret;
     177              :     }
     178              : 
     179            0 :     bool isAuxInfoExisted{false};
     180            0 :     for (u32 i = 0; i < auxInfo.auxInfoNum; i++) {
     181            0 :         if (auxInfo.auxInfoValues[i] != 0) { // 非零进行打印
     182            0 :             isAuxInfoExisted = true;
     183            0 :             HCCL_ERROR(
     184              :                 "devLogicId[%d], cqe_aux_info_type[%u], cqe_aux_info_value[0x%x]", devLogicId, auxInfo.auxInfoTypes[i],
     185              :                 auxInfo.auxInfoValues[i]);
     186              :         } else {
     187            0 :             HCCL_INFO(
     188              :                 "devLogicId[%d], cqe_aux_info_type[%u], cqe_aux_info_value[0x%x]", devLogicId, auxInfo.auxInfoTypes[i],
     189              :                 auxInfo.auxInfoValues[i]);
     190              :         }
     191              :     }
     192            0 :     if (!isAuxInfoExisted) {
     193            0 :         HCCL_ERROR("devLogicId[%d], all aux_info values are zero.", devLogicId);
     194              :     }
     195            0 :     return HCCL_SUCCESS;
     196              : }
     197              : 
     198            7 : bool IsMC2Exception(const rtExceptionInfo_t* exceptionInfo)
     199              : {
     200            7 :     return exceptionInfo->expandInfo.type == RT_EXCEPTION_FUSION
     201            7 :            && exceptionInfo->expandInfo.u.fusionInfo.type == RT_FUSION_AICORE_CCU;
     202              : }
     203              : 
     204            7 : bool TaskExceptionHost::ProcessDpuException(const rtExceptionInfo_t* exceptionInfo) const
     205              : {
     206            7 :     HCCL_RUN_INFO("[TaskExceptionHost][%s]begin to execute hccl task exception callback function.", __func__);
     207            7 :     bool isExce = false;
     208            7 :     errno_t ret = EOK;
     209            7 :     uint16_t hcclRet = 0;
     210            7 :     for (auto pairMap : g_taskExpMemMap) {
     211            0 :         std::string commId = pairMap.first;
     212              :         // 读取共享内存内容并打印
     213            0 :         ret = memcpy_s(
     214              :             &hcclRet, sizeof(uint16_t),
     215            0 :             reinterpret_cast<uint8_t*>(pairMap.second[exceptionInfo->deviceid]) + sizeof(uint8_t) + sizeof(uint16_t),
     216              :             sizeof(uint16_t));
     217            0 :         if (ret != EOK) {
     218            0 :             HCCL_ERROR("memcpy_s get dpu taskexception failed: %d", ret);
     219            0 :             return isExce;
     220              :         }
     221            0 :         if (hcclRet != 0) { // 有dpu任务出错
     222            0 :             HCCL_ERROR("[TaskExceptionHost][ProcessDpuException] Task from HCCL run failed.");
     223            0 :             HCCL_ERROR(
     224              :                 "[TaskExceptionHost][ProcessDpuException] errorCode[%d], devId[%u], commId[%s]", hcclRet,
     225              :                 exceptionInfo->deviceid, commId.c_str());
     226            0 :             ret = memset_s(
     227            0 :                 reinterpret_cast<uint8_t*>(pairMap.second[exceptionInfo->deviceid]) + sizeof(uint8_t)
     228            0 :                     + sizeof(uint16_t),
     229              :                 sizeof(uint16_t), 0, sizeof(uint16_t)); // 清空 dpu taskexception共享内存内容
     230            0 :             if (ret != EOK) {
     231            0 :                 HCCL_ERROR("memset_s clean dpu taskexception failed: %d", ret);
     232            0 :                 return isExce;
     233              :             }
     234            0 :             isExce = true;
     235            0 :             break;
     236              :         }
     237            0 :     }
     238            7 :     return isExce;
     239              : }
     240              : 
     241            7 : void TaskExceptionHost::Process(rtExceptionInfo_t* exceptionInfo)
     242              : {
     243            7 :     HCCL_RUN_INFO(
     244              :         "[TaskExceptionHost][%s], taskid[%u], streamid[%u], tid[%u], deviceid[%u], retcode[%u], type[%d]", __func__,
     245              :         exceptionInfo->taskid, exceptionInfo->streamid, exceptionInfo->tid, exceptionInfo->deviceid,
     246              :         exceptionInfo->retcode, exceptionInfo->expandInfo.type);
     247              : 
     248            7 :     if (IsMC2Exception(exceptionInfo)) { // MC2 taskException 新流程暂未支持,回退到老流程
     249            0 :         Hccl::TaskExceptionHandler::Process(exceptionInfo);
     250            0 :         return;
     251              :     }
     252              : 
     253              :     // dpu taskexception
     254            7 :     if (ProcessDpuException(exceptionInfo)) {
     255            0 :         HCCL_ERROR("[TaskExceptionHost][ProcessDpuException] end.");
     256            0 :         return;
     257              :     };
     258              : 
     259            7 :     ProcessHcclTaskException(exceptionInfo);
     260              : }
     261              : 
     262            7 : void TaskExceptionHost::ProcessHcclTaskException(rtExceptionInfo_t* exceptionInfo)
     263              : {
     264            7 :     Hccl::TaskInfo* curTask = nullptr;
     265            7 :     HcclResult ret = Hccl::GlobalMirrorTasks::Instance().FindTaskInfo(
     266              :         exceptionInfo->deviceid, exceptionInfo->streamid, exceptionInfo->taskid, curTask);
     267            7 :     CHK_PRT_RET(
     268              :         ret == HCCL_E_NOT_FOUND,
     269              :         HCCL_RUN_WARNING(
     270              :             "[%s]FindTaskInfo not found, deviceid[%u] streamid[%u] taskid[%u].", __func__, exceptionInfo->deviceid,
     271              :             exceptionInfo->streamid, exceptionInfo->taskid), );
     272              : 
     273            0 :     CHK_PRT_RET(
     274              :         ret != HCCL_SUCCESS || curTask == nullptr,
     275              :         HCCL_ERROR(
     276              :             "[%s]FindTaskInfo fail, ret[%d], deviceid[%u], streamid[%u], taskid[%u].", __func__, ret,
     277              :             exceptionInfo->deviceid, exceptionInfo->streamid, exceptionInfo->taskid), );
     278              : 
     279            0 :     if (curTask->taskParam_.taskType == Hccl::TaskParamType::TASK_AIV) {
     280            0 :         HCCL_RUN_INFO(
     281              :             "[TaskExceptionHost][%s] AIV taskType, taskid[%u] streamid[%u] deviceid[%u].", __func__,
     282              :             exceptionInfo->taskid, exceptionInfo->streamid, exceptionInfo->deviceid);
     283            0 :         return;
     284              :     }
     285              : 
     286            0 :     CHK_PRT_RET(curTask->dfxOpInfo_ == nullptr, HCCL_ERROR("[%s]fail, dfxOpInfo is nullptr", __func__), );
     287            0 :     bool isIndop_ = curTask->dfxOpInfo_->isIndop_;
     288            0 :     HCCL_INFO("[%s]isIndop_[%d], taskType[%s]", __func__, isIndop_, curTask->taskParam_.taskType.Describe().c_str());
     289              : 
     290              :     // 老流程TaskException打印
     291            0 :     if (!isIndop_) {
     292            0 :         Hccl::TaskExceptionHandler::Process(exceptionInfo);
     293            0 :         return;
     294              :     }
     295              : 
     296              :     // 新流程支持的TaskException打印
     297            0 :     std::unique_lock<std::mutex> lock(taskExceptionMutex_);
     298            0 :     u64 commHandle = reinterpret_cast<u64>(curTask->dfxOpInfo_->comm_);
     299            0 :     if (curTask->dfxOpInfo_->comm_ == nullptr || CommRegisterMap_.find(commHandle) == CommRegisterMap_.end()) {
     300            0 :         HCCL_ERROR(
     301              :             "[TaskExceptionHost][%s] commHandle[0x%llx] not exist, "
     302              :             "the comm may have been destroyed or was never registered",
     303              :             __func__, commHandle);
     304            0 :         return;
     305              :     }
     306              : 
     307            0 :     if (curTask->taskParam_.taskType == Hccl::TaskParamType::TASK_CCU) {
     308            0 :         CcuTaskException::ProcessCcuException(exceptionInfo, *curTask);
     309              :     } else {
     310            0 :         ProcessException(exceptionInfo, *curTask);
     311              :     }
     312            0 : }
     313              : 
     314            2 : std::string TaskExceptionHost::GetGroupRankInfo(const Hccl::TaskInfo& taskInfo) const
     315              : {
     316            2 :     if (taskInfo.dfxOpInfo_ == nullptr || taskInfo.dfxOpInfo_->comm_ == nullptr) {
     317            2 :         HCCL_ERROR("[TaskInfo][%s]TaskInfo communicator is nullptr.", __func__);
     318            4 :         return "";
     319              :     }
     320              : 
     321            0 :     hccl::CollComm* communicator = static_cast<hccl::CollComm*>(taskInfo.dfxOpInfo_->comm_);
     322              :     return Hccl::StringFormat(
     323            0 :         "group:[%s], rankSize[%u], rankId[%u]", communicator->GetCommId().c_str(), communicator->GetRankSize(),
     324            0 :         communicator->GetMyRankId());
     325              : }
     326              : 
     327            0 : void TaskExceptionHost::GetAicpuCqeErrRemoteLocalIdByRankId(
     328              :     hccl::CollComm* collComm, uint32_t rankid, u32& remoteLocalId) const
     329              : {
     330            0 :     if (collComm == nullptr || rankid == Hccl::DFX_INVALID_RANKID) {
     331            0 :         HCCL_ERROR("[GetAicpuCqeErrRemoteLocalIdByRankId]collComm is nullptr or rankId is invalid, rankId[%u]", rankid);
     332            0 :         remoteLocalId = Hccl::DFX_INVALID_RANKID;
     333            0 :         return;
     334              :     }
     335              : 
     336            0 :     Hccl::HcclCommunicator* commV2 = static_cast<Hccl::HcclCommunicator*>(collComm->GetCommunicatorV2());
     337            0 :     if (commV2 == nullptr) {
     338            0 :         HCCL_ERROR("[GetAicpuCqeErrRemoteLocalIdByRankId]commV2 is nullptr, rankId[%u]", rankid);
     339            0 :         remoteLocalId = Hccl::DFX_INVALID_RANKID;
     340            0 :         return;
     341              :     }
     342            0 :     void* rankGraph = nullptr;
     343            0 :     HcclResult ret = commV2->GetRankGraphV2(rankGraph);
     344            0 :     if (ret != HCCL_SUCCESS) {
     345            0 :         HCCL_ERROR("[GetAicpuCqeErrRemoteLocalIdByRankId]GetRankGraphV2 failed, rankId[%u], ret[%d]", rankid, ret);
     346            0 :         remoteLocalId = Hccl::DFX_INVALID_RANKID;
     347            0 :         return;
     348              :     }
     349            0 :     Hccl::RankGraph* rankGraphv2 = static_cast<Hccl::RankGraph*>(rankGraph);
     350            0 :     u32 LocalId = rankGraphv2->GetLocalId(rankid);
     351            0 :     remoteLocalId = LocalId;
     352            0 :     return;
     353              : }
     354              : 
     355            0 : void TaskExceptionHost::GetAicpuCqeErrNetInstanceByRankId(
     356              :     hccl::CollComm* collComm, uint32_t rankid, std::string& netInstanceId) const
     357              : {
     358            0 :     if (collComm == nullptr || rankid == Hccl::DFX_INVALID_RANKID) {
     359            0 :         HCCL_ERROR("[GetAicpuCqeErrNetInstanceByRankId]collComm is nullptr or rankId is invalid, rankId[%u]", rankid);
     360            0 :         netInstanceId = "";
     361            0 :         return;
     362              :     }
     363              : 
     364            0 :     Hccl::HcclCommunicator* commV2 = static_cast<Hccl::HcclCommunicator*>(collComm->GetCommunicatorV2());
     365            0 :     if (commV2 == nullptr) {
     366            0 :         HCCL_ERROR("[GetAicpuCqeErrNetInstanceByRankId]commV2 is nullptr, rankId[%u]", rankid);
     367            0 :         netInstanceId = "";
     368            0 :         return;
     369              :     }
     370            0 :     void* rankGraph = nullptr;
     371            0 :     HcclResult ret = commV2->GetRankGraphV2(rankGraph);
     372            0 :     if (ret != HCCL_SUCCESS) {
     373            0 :         HCCL_ERROR("[GetAicpuCqeErrNetInstanceByRankId]GetRankGraphV2 failed, rankId[%u], ret[%d]", rankid, ret);
     374            0 :         netInstanceId = "";
     375            0 :         return;
     376              :     }
     377            0 :     Hccl::RankGraph* rankGraphv2 = static_cast<Hccl::RankGraph*>(rankGraph);
     378            0 :     const Hccl::NetInstance* netInstance = rankGraphv2->GetNetInstanceByRankId(0, rankid);
     379            0 :     if (netInstance == nullptr) {
     380            0 :         HCCL_ERROR("[GetAicpuCqeErrNetInstanceByRankId]netInstance is nullptr, rankId[%u]", rankid);
     381            0 :         netInstanceId = "";
     382            0 :         return;
     383              :     }
     384            0 :     std::string netInsId = netInstance->GetNetInstId();
     385            0 :     netInstanceId = netInsId;
     386            0 :     return;
     387            0 : }
     388              : 
     389            0 : void TaskExceptionHost::GetAicpuCqeErrInfo(
     390              :     rtExceptionInfo_t* exceptionInfo, const Hccl::ErrorMessageReport& errorMessage,
     391              :     const Hccl::TaskInfo& taskInfo) const
     392              : {
     393            0 :     hccl::CollComm* collComm = static_cast<hccl::CollComm*>(taskInfo.dfxOpInfo_->comm_);
     394            0 :     u32 remoteLocalId = Hccl::DFX_INVALID_RANKID;
     395            0 :     GetAicpuCqeErrRemoteLocalIdByRankId(collComm, errorMessage.remoteUserRank, remoteLocalId);
     396            0 :     std::string netInstanceId = "";
     397            0 :     GetAicpuCqeErrNetInstanceByRankId(collComm, errorMessage.remoteUserRank, netInstanceId);
     398            0 :     ClusterMoniterGetAicpuCqeErrInfo(
     399            0 :         remoteLocalId, exceptionInfo->deviceid, errorMessage.ubCqeStatus, errorMessage.locEid.Describe(),
     400            0 :         errorMessage.rmtEid.Describe(), netInstanceId); // 上报AICPU CQE错误信息到集群监控
     401            0 :     return;
     402            0 : }
     403              : 
     404            0 : void TaskExceptionHost::ProcessException(rtExceptionInfo_t* exceptionInfo, const Hccl::TaskInfo& taskInfo)
     405              : {
     406            0 :     HCCL_RUN_INFO("[TaskExceptionHost][%s]begin to execute hccl task exception callback function.", __func__);
     407            0 :     Hccl::ErrorMessageReport errorMessage;
     408            0 :     if (!hasAicpuReport_) { // 防止aicpu task exception重复上报
     409            0 :         hccl::CollComm* communicator = static_cast<hccl::CollComm*>(taskInfo.dfxOpInfo_->comm_);
     410            0 :         errorMessage = communicator->GetAicpuTaskException();
     411              :     }
     412              : 
     413            0 :     if (strlen(errorMessage.tag) > 0) {
     414            0 :         hasAicpuReport_ = true;
     415            0 :         HandleAicpuErrorReport(exceptionInfo, errorMessage, taskInfo);
     416              :     } else {
     417            0 :         HandleHostErrorReport(exceptionInfo, taskInfo);
     418              :     }
     419            0 : }
     420              : 
     421            2 : void TaskExceptionHost::HandleHostErrorReport(rtExceptionInfo_t* exceptionInfo, const Hccl::TaskInfo& taskInfo) const
     422              : {
     423            2 :     HCCL_ERROR("[TaskExceptionHost][%s]Task from HCCL run failed.", __func__);
     424            2 :     if (taskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_NOTIFY_WAIT) {
     425            2 :         if (ShouldReportError()) {
     426            1 :             PrintTaskContextInfo(exceptionInfo->deviceid, exceptionInfo->streamid, exceptionInfo->taskid);
     427           17 :             RPT_INPUT_ERR(
     428              :                 true, "EI0002",
     429              :                 std::vector<std::string>(
     430              :                     {"remote_rankid", "base_information", "task_information", "group_rank_content"}),
     431              :                 std::vector<std::string>(
     432              :                     {std::to_string(taskInfo.remoteRank_), taskInfo.GetBaseInfo(), (taskInfo.GetParaInfo()), ""}));
     433              :         } else {
     434            1 :             HCCL_WARNING(
     435              :                 "[TaskExceptionHost] EI0002 already reported on device[%u], skip duplicate.", exceptionInfo->deviceid);
     436              :         }
     437              :     }
     438            2 :     std::string clusterMonitorErrMsg = AicpuGetAndPrintClusterMonitorErr(exceptionInfo);
     439            2 :     HCCL_ERROR(
     440              :         "[TaskExceptionHost]Task run failed, base information is deviceID:[%u], %s.", exceptionInfo->deviceid,
     441              :         taskInfo.GetIndopBaseInfo().c_str());
     442            2 :     HCCL_ERROR("[TaskExceptionHost]Task run failed, para information is %s.", taskInfo.GetParaInfo().c_str());
     443            2 :     HCCL_ERROR("[TaskExceptionHost]Task run failed, groupRank information is %s.", GetGroupRankInfo(taskInfo).c_str());
     444            2 :     HCCL_ERROR("[TaskExceptionHost]Task run failed, opData information is %s.", taskInfo.GetIndopDataInfo().c_str());
     445            4 : }
     446              : 
     447            5 : void TaskExceptionHost::PrintTaskContextInfo(uint32_t deviceId, uint32_t streamId, uint32_t taskId) const
     448              : {
     449            5 :     Hccl::TaskInfoQueue* queue = nullptr;
     450              :     try {
     451            5 :         queue = Hccl::GlobalMirrorTasks::Instance().GetQueue(deviceId, streamId);
     452            0 :     } catch (Hccl::HcclException& e) {
     453            0 :         HCCL_ERROR("Exception task queue not found. deviceId[%u], streamId[%u].", deviceId, streamId);
     454            0 :         return;
     455            0 :     }
     456              : 
     457            5 :     if (queue == nullptr) {
     458              :         // 未找到异常对应的TaskQueue
     459            0 :         HCCL_ERROR("Exception task queue not found. deviceId[%u], streamId[%u].", deviceId, streamId);
     460            0 :         return;
     461              :     }
     462              : 
     463           31 :     auto func = [taskId](const unique_ptr<Hccl::TaskInfo>& task) {
     464           31 :         return task->taskId_ == taskId;
     465            5 :     };
     466            5 :     auto taskIterPtr = queue->Find(func);
     467            5 :     if (taskIterPtr == nullptr || *taskIterPtr == *queue->End()) {
     468              :         // 在队列中未找到异常对应的TaskInfo
     469            2 :         HCCL_ERROR("Exception task not found. deviceId[%u], streamId[%u], taskId[%u].", deviceId, streamId, taskId);
     470            2 :         return;
     471              :     }
     472              : 
     473              :     // 找到当前异常task的前50个task(至多)
     474            3 :     vector<Hccl::TaskInfo*> taskContext{};
     475           10 :     for (uint32_t i = 0; i < TASK_CONTEXT_SIZE && *taskIterPtr != *queue->Begin(); ++i, --(*taskIterPtr)) {
     476            8 :         if ((**taskIterPtr)->taskId_ > taskId) {
     477            1 :             HCCL_ERROR(
     478              :                 "[%s]prev taskId[%u] is bigger than err taskId[%u], traversal end.", __func__, (**taskIterPtr)->taskId_,
     479              :                 taskId);
     480            1 :             break;
     481              :         }
     482            7 :         taskContext.emplace_back((**taskIterPtr).get());
     483              :     }
     484              : 
     485            3 :     HCCL_ERROR("[TaskExceptionHost]Task run failed, context sequence before error task is "
     486              :                "[SDMA:M(rank), RDMA:RS(rank,id), SendPayload:SP(rank), InlineReduce:IR(rank), Reduce:R(rank), "
     487              :                "NotifyRecord:NR(rank,id), NotifyWait:NW(rank,id), SendNotify:SN(rank,id), "
     488              :                "WriteWithNotify:WN(rank,id), WriteReduceWithNotify:WRN(rank,id)]:");
     489              : 
     490            3 :     std::string taskContextInfo = "";
     491           10 :     for (auto it = taskContext.rbegin(); it != taskContext.rend(); ++it) {
     492            7 :         std::string conciseInfo = (*it)->GetConciseBaseInfo();
     493            7 :         conciseInfo += ",";
     494              : 
     495            7 :         if (taskContextInfo.size() + conciseInfo.size() >= TASK_CONTEXT_INFO_SIZE) {
     496            0 :             HCCL_ERROR("[TaskExceptionHost]%s", taskContextInfo.c_str());
     497            0 :             taskContextInfo = "";
     498              :         }
     499              : 
     500            7 :         taskContextInfo += conciseInfo;
     501            7 :     }
     502            3 :     HCCL_ERROR("[TaskExceptionHost]%s end.", taskContextInfo.c_str());
     503            5 : }
     504              : 
     505            0 : inline void PrintBaseErrorLog(const std::string& stageErrInfo, const std::string& baseInfo)
     506              : {
     507            0 :     HCCL_ERROR("%sTask run failed, base information is %s", stageErrInfo.c_str(), baseInfo.c_str());
     508            0 : }
     509              : 
     510            0 : inline void PrintParaErrorLog(const std::string& stageErrInfo, const std::string& paraInfoStr)
     511              : {
     512            0 :     HCCL_ERROR("%sTask run failed, para information is %s.", stageErrInfo.c_str(), paraInfoStr.c_str());
     513            0 : }
     514              : 
     515            0 : inline void PrintOpDataErrorLog(const std::string& stageErrInfo, const std::string& opDataContent)
     516              : {
     517            0 :     HCCL_ERROR("%sTask run failed, opData information is %s", stageErrInfo.c_str(), opDataContent.c_str());
     518            0 : }
     519              : 
     520            0 : inline void PrintGroupErrorLog(const std::string& stageErrInfo, const std::string& groupRankContent)
     521              : {
     522            0 :     HCCL_ERROR("%sTask run failed, groupRank information is %s.", stageErrInfo.c_str(), groupRankContent.c_str());
     523            0 : }
     524              : 
     525            0 : void TaskExceptionHost::PrintGroupErrorMessage(
     526              :     const Hccl::ErrorMessageReport& errorMessage, [[maybe_unused]] const Hccl::TaskInfo& exceptionTaskInfo,
     527              :     std::string& groupRankContent, std::string& stageErrInfo) const
     528              : {
     529            0 :     groupRankContent += "group:[";
     530            0 :     groupRankContent += std::string(errorMessage.group);
     531            0 :     groupRankContent += "], rankSize[";
     532            0 :     groupRankContent += std::to_string(errorMessage.rankSize);
     533            0 :     groupRankContent += "], localRank[";
     534            0 :     groupRankContent += std::to_string(errorMessage.rankId);
     535            0 :     groupRankContent += "], remoteRank[";
     536            0 :     groupRankContent += std::to_string(errorMessage.remoteUserRank);
     537            0 :     groupRankContent += "]";
     538              : 
     539            0 :     PrintGroupErrorLog(stageErrInfo, groupRankContent);
     540            0 :     return;
     541              : }
     542              : 
     543              : const std::map<HcclReduceOp, std::string> HCOM_REDUCE_OP_STR_MAP{
     544              :     {HcclReduceOp::HCCL_REDUCE_SUM, "sum"},
     545              :     {HcclReduceOp::HCCL_REDUCE_PROD, "prod"},
     546              :     {HcclReduceOp::HCCL_REDUCE_MAX, "max"},
     547              :     {HcclReduceOp::HCCL_REDUCE_MIN, "min"},
     548              :     {HcclReduceOp::HCCL_REDUCE_RESERVED, "invalid"}};
     549              : 
     550            0 : inline std::string GetReduceOpEnumStr2(HcclReduceOp reduceOp)
     551              : {
     552            0 :     auto iter = HCOM_REDUCE_OP_STR_MAP.find(reduceOp);
     553            0 :     if (iter == HCOM_REDUCE_OP_STR_MAP.end()) {
     554            0 :         return "HcclReduceOp(" + std::to_string(reduceOp) + ")";
     555              :     } else {
     556            0 :         return iter->second;
     557              :     }
     558              : }
     559              : 
     560              : const std::map<HcclDataType, std::string> HCOM_DATA_TYPE_STR_MAP{
     561              :     {HcclDataType::HCCL_DATA_TYPE_INT8, "int8"},       {HcclDataType::HCCL_DATA_TYPE_INT16, "int16"},
     562              :     {HcclDataType::HCCL_DATA_TYPE_INT32, "int32"},     {HcclDataType::HCCL_DATA_TYPE_INT64, "int64"},
     563              :     {HcclDataType::HCCL_DATA_TYPE_UINT64, "uint64"},   {HcclDataType::HCCL_DATA_TYPE_FP16, "float16"},
     564              :     {HcclDataType::HCCL_DATA_TYPE_FP32, "float32"},    {HcclDataType::HCCL_DATA_TYPE_UINT8, "uint8"},
     565              :     {HcclDataType::HCCL_DATA_TYPE_UINT16, "uint16"},   {HcclDataType::HCCL_DATA_TYPE_UINT32, "uint32"},
     566              :     {HcclDataType::HCCL_DATA_TYPE_FP64, "float64"},    {HcclDataType::HCCL_DATA_TYPE_BFP16, "bfloat16"},
     567              :     {HcclDataType::HCCL_DATA_TYPE_INT128, "int128"},   {HcclDataType::HCCL_DATA_TYPE_FP8E4M3, "fp8e4m3"},
     568              :     {HcclDataType::HCCL_DATA_TYPE_FP8E5M2, "fp8e5m2"}, {HcclDataType::HCCL_DATA_TYPE_RESERVED, "reserved"}};
     569              : 
     570            0 : inline std::string GetDataTypeEnumStr2(HcclDataType dataType)
     571              : {
     572            0 :     auto iter = HCOM_DATA_TYPE_STR_MAP.find(dataType);
     573            0 :     if (iter == HCOM_DATA_TYPE_STR_MAP.end()) {
     574            0 :         return "HcclDataType(" + std::to_string(dataType) + ")";
     575              :     } else {
     576            0 :         return iter->second;
     577              :     }
     578              : }
     579              : 
     580            0 : inline std::string GetDataTypeEnumStr(u32 dataType)
     581              : {
     582            0 :     auto hcclDataType = static_cast<HcclDataType>(dataType);
     583            0 :     return GetDataTypeEnumStr2(hcclDataType);
     584              : }
     585              : inline std::string GetOpTypeEnumStr(u32 opType)
     586              : {
     587              :     Hccl::OpType hcclOpType = static_cast<Hccl::OpType::Value>(opType);
     588              :     return hcclOpType.Describe();
     589              : }
     590              : 
     591            0 : void TaskExceptionHost::PrintOpDataErrorMessage(
     592              :     u32 deviceId, const Hccl::ErrorMessageReport& errorMessage, std::string& stageErrInfo) const
     593              : {
     594            0 :     std::stringstream opDataStr;
     595            0 :     opDataStr << "src" << "[0x" << std::hex << errorMessage.srcAddr << "], dst[0x" << std::hex << errorMessage.dstAddr
     596            0 :               << "], ";
     597              : 
     598            0 :     std::string opStr;
     599            0 :     if (errorMessage.reduceType != HcclReduceOp::HCCL_REDUCE_RESERVED) {
     600            0 :         opStr += "reduceType[";
     601            0 :         opStr += GetReduceOpEnumStr2(static_cast<HcclReduceOp>(errorMessage.reduceType));
     602            0 :         opStr += "], ";
     603              :     }
     604              : 
     605            0 :     std::string opDataContent;
     606            0 :     opDataContent += "deviceId:[";
     607            0 :     opDataContent += std::to_string(deviceId);
     608            0 :     opDataContent += "], index[";
     609            0 :     opDataContent += std::to_string(errorMessage.opIndex);
     610            0 :     opDataContent += "], count[";
     611            0 :     opDataContent += std::to_string(errorMessage.count);
     612            0 :     opDataContent += "], ";
     613            0 :     opDataContent += opStr;
     614            0 :     opDataContent += opDataStr.str();
     615            0 :     opDataContent += "dataType[";
     616            0 :     opDataContent += GetDataTypeEnumStr(errorMessage.dataType);
     617            0 :     opDataContent += "].";
     618              : 
     619            0 :     PrintOpDataErrorLog(stageErrInfo, opDataContent);
     620            0 :     return;
     621            0 : }
     622              : 
     623            2 : void TaskExceptionHost::ReportErrorMsg(
     624              :     const Hccl::TaskInfo& exceptionTaskInfo, [[maybe_unused]] const std::string& groupRankContent,
     625              :     const Hccl::ErrorMessageReport& errorMessage, rtExceptionInfo_t* exceptionInfo) const
     626              : {
     627            2 :     HCCL_RUN_INFO("[ReportErrorMsg] start, taskType[%d]", exceptionTaskInfo.taskParam_.taskType);
     628              : 
     629            2 :     std::string clusterMonitorErrMsg = AicpuGetAndPrintClusterMonitorErr(exceptionInfo);
     630              : 
     631            2 :     if (exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_NOTIFY_WAIT) {
     632            2 :         if (ShouldReportError()) {
     633            1 :             HCCL_ERROR("[ReportErrorMsg] EI0002");
     634           18 :             RPT_INPUT_ERR(
     635              :                 true, "EI0002",
     636              :                 std::vector<std::string>(
     637              :                     {"remote_rankid", "base_information", "task_information", "group_rank_content"}),
     638              :                 std::vector<std::string>(
     639              :                     {std::to_string(exceptionTaskInfo.remoteRank_), exceptionTaskInfo.GetIndopBaseInfo().c_str(),
     640              :                      (exceptionTaskInfo.GetParaInfo() + clusterMonitorErrMsg).c_str(), ""}));
     641              :         } else {
     642            1 :             HCCL_WARNING(
     643              :                 "[ReportErrorMsg] EI0002 already reported on device[%u], skip duplicate.", exceptionInfo->deviceid);
     644              :         }
     645            0 :     } else if (
     646            0 :         exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_WRITE_REDUCE_WITH_NOTIFY
     647            0 :         || exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_WRITE_WITH_NOTIFY
     648            0 :         || exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_UB_INLINE_WRITE
     649            0 :         || exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_UB_REDUCE_INLINE
     650            0 :         || exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_UB) {
     651            0 :         ReportEI0018Error(exceptionTaskInfo, errorMessage);
     652              :     }
     653            5 : }
     654              : 
     655            4 : bool TaskExceptionHost::ShouldReportError() const
     656              : {
     657            4 :     std::lock_guard<std::mutex> lock(ei0002ReportedMutex_);
     658            4 :     if (!ei0002Reported_) {
     659            2 :         ei0002Reported_ = true;
     660            2 :         return true;
     661              :     }
     662            2 :     return false;
     663            4 : }
     664              : 
     665            0 : void TaskExceptionHost::ReportEI0018Error(
     666              :     const Hccl::TaskInfo& exceptionTaskInfo, const Hccl::ErrorMessageReport& errorMessage) const
     667              : {
     668            0 :     hccl::CollComm* collComm = static_cast<hccl::CollComm*>(exceptionTaskInfo.dfxOpInfo_->comm_);
     669            0 :     std::string localServerId = "";
     670            0 :     GetAicpuCqeErrNetInstanceByRankId(collComm, errorMessage.rankId, localServerId);
     671            0 :     u32 localDeviceId = Hccl::DFX_INVALID_RANKID;
     672            0 :     GetAicpuCqeErrRemoteLocalIdByRankId(collComm, errorMessage.rankId, localDeviceId);
     673            0 :     std::string remoteServerId = "";
     674            0 :     GetAicpuCqeErrNetInstanceByRankId(collComm, errorMessage.remoteUserRank, remoteServerId);
     675            0 :     u32 remoteDeviceId = Hccl::DFX_INVALID_RANKID;
     676            0 :     GetAicpuCqeErrRemoteLocalIdByRankId(collComm, errorMessage.remoteUserRank, remoteDeviceId);
     677            0 :     Hccl::IpAddress localAddr(errorMessage.locEid);
     678            0 :     Hccl::IpAddress remoteAddr(errorMessage.rmtEid);
     679            0 :     HCCL_ERROR("[ReportErrorMsg] EI0018");
     680            0 :     RPT_INPUT_ERR(
     681              :         true, "EI0018",
     682              :         std::vector<std::string>(
     683              :             {"localServerId", "localDeviceId", "localDeviceIp", "remoteServerId", "remoteDeviceId", "remoteDeviceIp"}),
     684              :         std::vector<std::string>(
     685              :             {localServerId, std::to_string(localDeviceId), localAddr.GetReverseEid().Describe().c_str(), remoteServerId,
     686              :              std::to_string(remoteDeviceId), remoteAddr.GetReverseEid().Describe().c_str()}));
     687            0 : }
     688              : 
     689            9 : void GetTaskParam(Hccl::TaskParam& taskParam, const Hccl::ErrorMessageReport& errMsgInfo)
     690              : {
     691            9 :     switch (errMsgInfo.taskType) {
     692            2 :         case Hccl::TaskParamType::TASK_NOTIFY_WAIT:
     693              :         case Hccl::TaskParamType::TASK_NOTIFY_RECORD:
     694            2 :             taskParam.taskPara.Notify.notifyID = errMsgInfo.notifyId;
     695            2 :             taskParam.taskPara.Notify.value = errMsgInfo.notifyValue;
     696            2 :             break;
     697            2 :         case Hccl::TaskParamType::TASK_UB_REDUCE_INLINE:
     698              :         case Hccl::TaskParamType::TASK_WRITE_REDUCE_WITH_NOTIFY:
     699            2 :             taskParam.taskPara.Reduce.notifyID = errMsgInfo.notifyId;
     700            2 :             taskParam.taskPara.Reduce.notifyValue = errMsgInfo.notifyValue;
     701            2 :             taskParam.taskPara.Reduce.locEid = errMsgInfo.locEid;
     702            2 :             taskParam.taskPara.Reduce.rmtEid = errMsgInfo.rmtEid;
     703            2 :             taskParam.taskPara.Reduce.linkType = errMsgInfo.linkType;
     704            2 :             taskParam.taskPara.Reduce.size = errMsgInfo.size;
     705            2 :             taskParam.taskPara.Reduce.src = reinterpret_cast<void*>(errMsgInfo.taskSrcAddr);
     706            2 :             taskParam.taskPara.Reduce.dst = reinterpret_cast<void*>(errMsgInfo.taskDstAddr);
     707            2 :             break;
     708            1 :         case Hccl::TaskParamType::TASK_REDUCE_INLINE:
     709            1 :             taskParam.taskPara.Reduce.reduceOp = static_cast<HcclReduceOp>(errMsgInfo.reduceType);
     710            1 :             break;
     711            2 :         case Hccl::TaskParamType::TASK_UB_INLINE_WRITE:
     712              :         case Hccl::TaskParamType::TASK_WRITE_WITH_NOTIFY:
     713            2 :             taskParam.taskPara.DMA.notifyID = errMsgInfo.notifyId;
     714            2 :             taskParam.taskPara.DMA.notifyValue = errMsgInfo.notifyValue;
     715            2 :             taskParam.taskPara.DMA.locEid = errMsgInfo.locEid;
     716            2 :             taskParam.taskPara.DMA.rmtEid = errMsgInfo.rmtEid;
     717            2 :             taskParam.taskPara.DMA.linkType = errMsgInfo.linkType;
     718            2 :             taskParam.taskPara.DMA.size = errMsgInfo.size;
     719            2 :             taskParam.taskPara.DMA.src = reinterpret_cast<void*>(errMsgInfo.taskSrcAddr);
     720            2 :             taskParam.taskPara.DMA.dst = reinterpret_cast<void*>(errMsgInfo.taskDstAddr);
     721            2 :             break;
     722            1 :         case Hccl::TaskParamType::TASK_UB:
     723            1 :             taskParam.taskPara.DMA.locEid = errMsgInfo.locEid;
     724            1 :             taskParam.taskPara.DMA.rmtEid = errMsgInfo.rmtEid;
     725            1 :             taskParam.taskPara.DMA.linkType = errMsgInfo.linkType;
     726            1 :             taskParam.taskPara.DMA.size = errMsgInfo.size;
     727            1 :             taskParam.taskPara.DMA.src = reinterpret_cast<void*>(errMsgInfo.taskSrcAddr);
     728            1 :             taskParam.taskPara.DMA.dst = reinterpret_cast<void*>(errMsgInfo.taskDstAddr);
     729            1 :             break;
     730            1 :         case Hccl::TaskParamType::TASK_SDMA:
     731            1 :             taskParam.taskPara.DMA.linkType = errMsgInfo.linkType;
     732            1 :             taskParam.taskPara.DMA.size = errMsgInfo.size;
     733            1 :             taskParam.taskPara.DMA.src = reinterpret_cast<void*>(errMsgInfo.taskSrcAddr);
     734            1 :             taskParam.taskPara.DMA.dst = reinterpret_cast<void*>(errMsgInfo.taskDstAddr);
     735            1 :             break;
     736            0 :         default:
     737            0 :             HCCL_ERROR("[TaskException][HOST]%s taskType[%d] is not supported", __func__, taskParam.taskType);
     738            0 :             return;
     739              :     }
     740              : }
     741              : 
     742            0 : void TaskExceptionHost::HandleAicpuErrorReport(
     743              :     rtExceptionInfo_t* exceptionInfo, const Hccl::ErrorMessageReport& errorMessage,
     744              :     const Hccl::TaskInfo& taskInfo) const
     745              : {
     746            0 :     std::string groupRankContent;
     747            0 :     u32 streamId = static_cast<u32>(errorMessage.streamId);
     748            0 :     std::string tag = std::string(errorMessage.tag);
     749            0 :     Hccl::TaskParam taskParam{};
     750            0 :     taskParam.taskType = errorMessage.taskType;
     751            0 :     GetTaskParam(taskParam, errorMessage);
     752            0 :     std::shared_ptr<Hccl::DfxOpInfo> dfxOpInfo = std::make_shared<Hccl::DfxOpInfo>();
     753            0 :     dfxOpInfo->tag_ = tag;
     754            0 :     dfxOpInfo->comm_ = taskInfo.dfxOpInfo_->comm_;
     755            0 :     Hccl::TaskInfo exceptionTaskInfo(streamId, errorMessage.taskId, errorMessage.remoteUserRank, taskParam, dfxOpInfo);
     756            0 :     auto logKeywordL2 = exceptionTaskInfo.taskParam_.taskType == Hccl::TaskParamType::TASK_NOTIFY_WAIT ?
     757              :                             Hccl::LOG_KEYWORDS_TIMEOUT :
     758            0 :                             Hccl::LOG_KEYWORDS_RUN_FAILED;
     759              :     auto stageErrInfo
     760            0 :         = "[" + Hccl::LOG_KEYWORDS_TASK_EXEC + "][" + logKeywordL2 + "][" + Hccl::LOG_KEYWORDS_AICPU + "]";
     761            0 :     HCCL_ERROR("%sTask from HCCL run failed.", stageErrInfo.c_str());
     762              :     // 防止tag字符串过长, 信息分开打印
     763            0 :     PrintBaseErrorLog(stageErrInfo, exceptionTaskInfo.GetIndopBaseInfo());
     764            0 :     PrintParaErrorLog(stageErrInfo, exceptionTaskInfo.GetParaInfo());
     765            0 :     PrintGroupErrorMessage(errorMessage, exceptionTaskInfo, groupRankContent, stageErrInfo);
     766            0 :     PrintOpDataErrorMessage(exceptionInfo->deviceid, errorMessage, stageErrInfo);
     767            0 :     HCCL_ERROR(
     768              :         "errorMessage taskType[%s], rtCqErrorType[%u], rtCqErrorCode[%u]. ", errorMessage.taskType.Describe().c_str(),
     769              :         static_cast<u32>(errorMessage.rtCqErrorType), errorMessage.rtCqErrorCode);
     770              : 
     771              :     // 打印UB DFX寄存器信息
     772            0 :     PrintUbDfxInfo(exceptionInfo, errorMessage);
     773            0 :     ReportErrorMsg(exceptionTaskInfo, groupRankContent, errorMessage, exceptionInfo);
     774            0 :     if (errorMessage.ubCqeStatus != 0) {
     775            0 :         GetAicpuCqeErrInfo(exceptionInfo, errorMessage, taskInfo);
     776              :     }
     777            0 : }
     778              : 
     779            0 : void TaskExceptionHost::PrintUbDfxInfo(
     780              :     rtExceptionInfo_t* exceptionInfo, const Hccl::ErrorMessageReport& errorMessage) const
     781              : {
     782            0 :     if (errorMessage.taskType == Hccl::TaskParamType::TASK_WRITE_WITH_NOTIFY
     783            0 :         || errorMessage.taskType == Hccl::TaskParamType::TASK_WRITE_REDUCE_WITH_NOTIFY
     784            0 :         || errorMessage.taskType == Hccl::TaskParamType::TASK_UB_INLINE_WRITE
     785            0 :         || errorMessage.taskType == Hccl::TaskParamType::TASK_UB_REDUCE_INLINE
     786            0 :         || errorMessage.taskType == Hccl::TaskParamType::TASK_UB) {
     787            0 :         HCCL_ERROR(
     788              :             "errorMessage ubCqeStatus[%u], localEid[%s], remoteEid[%s]. ", static_cast<u32>(errorMessage.ubCqeStatus),
     789              :             errorMessage.locEid.Describe().c_str(), errorMessage.rmtEid.Describe().c_str());
     790            0 :         auto addr = Hccl::IpAddress(errorMessage.locEid);
     791            0 :         u32 devPhyId = Hccl::HrtGetDevicePhyIdByIndex(exceptionInfo->deviceid);
     792            0 :         auto rdmaHandle = Hccl::RdmaHandleManager::GetInstance().GetByIp(devPhyId, addr);
     793            0 :         HrtRaDumpJettyContext(reinterpret_cast<void*>(errorMessage.jettyHandle), errorMessage.jettyId);
     794            0 :         PrintUbRegisters(static_cast<s32>(exceptionInfo->deviceid), rdmaHandle);
     795              :     }
     796            0 : }
     797              : } // namespace hcomm
        

Generated by: LCOV version 2.0-1