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: 28.6 % 433 124
Test Date: 2026-07-28 12:11:00 Functions: 37.1 % 35 13

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

Generated by: LCOV version 2.0-1