LCOV - code coverage report
Current view: top level - legacy/ascend950/framework/communicator/aicpu - aicpu_mc2_handler.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 90.7 % 107 97
Test Date: 2026-07-28 12:11:00 Functions: 100.0 % 10 10

            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 <shared_mutex>
      12              : #include "inc/aicpu_mc2_handler.h"
      13              : #include "inc/aicpu_utils.h"
      14              : #include "communicator_impl_lite_manager.h"
      15              : #include "log.h"
      16              : 
      17              : namespace Hccl {
      18           28 : AicpuMc2Handler::AicpuMc2Handler()
      19              : {
      20           28 : }
      21              : 
      22            6 : AicpuMc2Handler &AicpuMc2Handler::GetInstance()
      23              : {
      24            6 :     static AicpuMc2Handler instance_;
      25            6 :     return instance_;
      26              : }
      27              : 
      28            5 : HcclResult AicpuMc2Handler::HcclGetCommHandleByCtx(void *ctx, void **opHandle) const
      29              : {
      30           15 :     HCCL_RUN_INFO("[%s]HcclGetCommHandleByCtx begin, ctx:%p, *ctx:%llu", __func__, ctx, *((uint64_t *)ctx));
      31              :     // 存储kernel参数
      32            5 :     unique_lock<std::shared_timed_mutex> handlerLock(AicpuUtils::GetInstance().handlerMutex_);
      33            5 :     AicpuUtils::GetInstance().kernelParam_ = reinterpret_cast<HcclKernelParamLite *>(ctx);
      34            5 :     uint32_t commIdIndex = AicpuUtils::GetInstance().kernelParam_->comm.idIndex;
      35            5 :     if (AicpuUtils::GetInstance().kernelParamMap_.find(commIdIndex) == AicpuUtils::GetInstance().kernelParamMap_.end()) {
      36            1 :         AicpuUtils::GetInstance().kernelParamMap_[commIdIndex] = AicpuUtils::GetInstance().kernelParam_;
      37              :     }
      38            5 :     handlerLock.unlock();
      39              : 
      40              :     // 创建单例对象
      41            5 :     std::shared_lock<std::shared_timed_mutex> sharedLock(AicpuUtils::GetInstance().handlerMutex_);
      42            5 :     AicpuUtils::GetInstance().CreateSingleInstance(ctx);
      43            5 :     CHK_RET(AicpuUtils::GetInstance().Init());
      44              : 
      45              :     // 初始化硬件参数
      46            5 :     DevCapability::GetInstance().Init(AicpuUtils::GetInstance().kernelParam_->comm.devType);
      47              : 
      48           15 :     HCCL_INFO("[%s]DevCapability %s, kernelParam_.algName[%s], commIdIndex[%u]", __func__,
      49              :               AicpuUtils::GetInstance().kernelParam_->comm.devType.Describe().c_str(), AicpuUtils::GetInstance().kernelParam_->algName, commIdIndex);
      50              : 
      51            5 :     CommunicatorImplLite *communicatorImplLite = CommunicatorImplLiteMgr::GetInstance().Get(commIdIndex);
      52            8 :     CHK_PTR_NULL(communicatorImplLite);
      53            4 :     return AicpuUtils::GetInstance().GetCommHandle(communicatorImplLite, opHandle);
      54            5 : }
      55              : 
      56              : // HcclReleaseComm 设置isUsed标记未使用,不会释放opHandle
      57            2 : HcclResult AicpuMc2Handler::HcclReleaseComm(void *opHandle) const
      58              : {
      59            6 :     HCCL_RUN_INFO("[%s]HcclReleaseComm begin", __func__);
      60            2 :     CommunicatorImplLite *communicatorImplLite = reinterpret_cast<CommunicatorImplLite *>(opHandle);
      61              :     // isUsed状态置false
      62            2 :     unique_lock<std::mutex> aicpuLock(communicatorImplLite->GetAicpuMc2Mutex());
      63            2 :     communicatorImplLite->SetIsUsed(false);
      64            2 :     aicpuLock.unlock();
      65              : 
      66            2 :     unique_lock<std::shared_timed_mutex> handlerLock(AicpuUtils::GetInstance().handlerMutex_);
      67            2 :     uint32_t commIdIndex = communicatorImplLite->GetCommIdIndex();
      68            2 :     auto it = AicpuUtils::GetInstance().kernelParamMap_.find(commIdIndex);
      69            2 :     if (it != AicpuUtils::GetInstance().kernelParamMap_.end()) {
      70            2 :         AicpuUtils::GetInstance().kernelParamMap_.erase(it);
      71              :     }
      72            2 :     return HCCL_SUCCESS;
      73            2 : }
      74              : 
      75            2 : HcclResult AicpuMc2Handler::HcclGetTaskStatus(void *opHandle, HcclTaskStatus *status) const
      76              : {
      77            2 :     CommunicatorImplLite *communicatorImplLite = reinterpret_cast<CommunicatorImplLite *>(opHandle);
      78              : 
      79            2 :     auto *streamLiteMgr = communicatorImplLite->GetStreamLiteMgr();
      80            2 :     CHK_PTR_NULL(streamLiteMgr);
      81              : 
      82            2 :     StreamLite *curStream = streamLiteMgr->GetMaster();
      83            2 :     CHK_PTR_NULL_WITH_MSG(curStream, "commId[%u].", communicatorImplLite->GetCommIdIndex());
      84            6 :     HCCL_INFO("[%s]commId[%u], stream[%u].", __func__, communicatorImplLite->GetCommIdIndex(), curStream->GetId());
      85            6 :     if (AicpuUtils::GetInstance().GetException(curStream, GET_TASK_STATUS, communicatorImplLite) == 1) {
      86            1 :         *status = HcclTaskStatus::HCCL_CQE_ERROR;
      87            1 :         return HCCL_SUCCESS;
      88              :     }
      89              : 
      90            1 :     for (uint32_t id = 0; id < streamLiteMgr->SizeOfSlaves(); id++) {
      91            0 :         curStream = streamLiteMgr->GetSlave(id);
      92            0 :         CHK_PTR_NULL_WITH_MSG(curStream, "commId[%u]", communicatorImplLite->GetCommIdIndex());
      93            0 :         HCCL_INFO("[%s]commId[%u], stream[%u].", __func__, communicatorImplLite->GetCommIdIndex(), curStream->GetId());
      94            0 :         if (AicpuUtils::GetInstance().GetException(curStream, GET_TASK_STATUS, communicatorImplLite) == 1) {
      95            0 :             *status = HcclTaskStatus::HCCL_CQE_ERROR;
      96            0 :             return HCCL_SUCCESS;
      97              :         }
      98              :     }
      99              : 
     100            1 :     *status = HcclTaskStatus::HCCL_NORMAL_STATUS;
     101            1 :     return HCCL_SUCCESS;
     102              : }
     103              : 
     104            6 : HcclResult AicpuMc2Handler::HcclCheckFinishByStream(void *opHandle) const
     105              : {
     106            6 :     CommunicatorImplLite *communicatorImplLite = reinterpret_cast<CommunicatorImplLite *>(opHandle);
     107              : 
     108            6 :     auto *streamLiteMgr = communicatorImplLite->GetStreamLiteMgr();
     109            9 :     CHK_PTR_NULL(streamLiteMgr);
     110              : 
     111            5 :     StreamLite *stream = streamLiteMgr->GetMaster();
     112            8 :     CHK_PTR_NULL(stream);
     113              : 
     114              :     // 比较主流首尾指针
     115            4 :     RtsqBase *rtsq = stream->GetRtsq();
     116            4 :     CHK_PTR_NULL_WITH_MSG(rtsq, "commId[%u], stream[%u].", communicatorImplLite->GetCommIdIndex(), stream->GetId());
     117              : 
     118            4 :     auto sqHead = rtsq->QuerySqHead();
     119            4 :     auto sqTail = rtsq->QuerySqTail();
     120            4 :     if (sqTail == sqHead) {
     121            6 :         HCCL_INFO("[%s]Stream %u finished, sq id %u, head&tail %u.", __func__, stream->GetId(), stream->GetSqId(),
     122              :                 sqHead);
     123            2 :         return HCCL_SUCCESS;
     124              :     }
     125            2 :     return HCCL_E_UNAVAIL;
     126              : }
     127              : 
     128            5 : HcclResult AicpuMc2Handler::HcclPrintTaskExceptionAllComm(void *opHandle) const
     129              : {
     130              :     // 打印全部通信域状态信息
     131            5 :     CommunicatorImplLite *curCommunicatorImplLite = reinterpret_cast<CommunicatorImplLite *>(opHandle);
     132            5 :     string                additionInfo;
     133            5 :     auto                  communicatorImplLiteVec = CommunicatorImplLiteMgr::GetInstance().GetAll();
     134            9 :     for (CommunicatorImplLite *communicatorImplLite : communicatorImplLiteVec) {
     135              :         // 打印主流信息
     136            4 :         if (communicatorImplLite == curCommunicatorImplLite) {
     137              :             additionInfo = "[HcclPrintTaskExceptionAllComm]Current communicatorImplLite exists exception,commId "
     138            4 :                            + to_string(communicatorImplLite->GetCommIdIndex());
     139              :         } else {
     140            0 :             additionInfo = "";
     141              :         }
     142            4 :         auto *streamLiteMgr = communicatorImplLite->GetStreamLiteMgr();
     143            4 :         if (streamLiteMgr == nullptr) {
     144            3 :             HCCL_WARNING("[%s]CommunicatorImplLite streamLiteMgr is nullptr", __func__);
     145            1 :             continue;
     146            1 :         }
     147              : 
     148            3 :         StreamLite *curStream = streamLiteMgr->GetMaster();
     149            3 :         string nullInfo = "streamLiteMgr->GetMaster is nullptr";
     150            3 :         AicpuUtils::GetInstance().GetStreamException(curStream, nullInfo, communicatorImplLite, additionInfo);
     151              : 
     152            3 :         for (uint32_t id = 0; id < streamLiteMgr->SizeOfSlaves(); id++) {
     153            0 :             curStream = streamLiteMgr->GetSlave(id);
     154            0 :             nullInfo = "streamLiteMgr->GetSlave(" + to_string(id) + ") is nullptr";
     155            0 :             AicpuUtils::GetInstance().GetStreamException(curStream, nullInfo, communicatorImplLite, additionInfo);
     156              :         }
     157            3 :     }
     158            5 :     return HCCL_SUCCESS;
     159            5 : }
     160              : 
     161              : // ccore sqe wait拼写并下发流
     162            2 : HcclResult AicpuMc2Handler::HcclLaunchCcoreWait(void *opHandle, uint64_t waitAddr, uint32_t turnNum,
     163              :                                                 uint64_t turnNumAddr, bool isLast) const
     164              : {
     165            6 :     HCCL_INFO("[%s]opHandle %p, waitAddr %llu, turnNum %u, turnNumAddr %llu, isLast %u.", __func__, opHandle,
     166              :             waitAddr, turnNum, turnNumAddr, isLast);
     167            2 :     return AicpuUtils::GetInstance().HcclLaunchCcore(opHandle, waitAddr, turnNum, turnNumAddr, isLast, CCORE_WAIT_TYPE);
     168              : }
     169              : 
     170              : // ccore sqe record拼写并下发流
     171            3 : HcclResult AicpuMc2Handler::HcclLaunchCcorePost(void *opHandle, uint64_t recordAddr, uint32_t turnNum,
     172              :                                                 uint64_t turnNumAddr) const
     173              : {
     174            9 :     HCCL_INFO("[%s]opHandle %p, recordAddr %llu, turnNum %u, turnNumAddr %llu.", __func__, opHandle,
     175              :             recordAddr, turnNum, turnNumAddr);
     176            3 :     return AicpuUtils::GetInstance().HcclLaunchCcore(opHandle, recordAddr, turnNum, turnNumAddr, false, CCORE_NOTIFY_TYPE);
     177              : }
     178              : 
     179            8 : HcclResult AicpuMc2Handler::HcclLaunchOp(void *opHandle, HcclOpData *data) const
     180              : {
     181            8 :     CommunicatorImplLite *communicatorImplLite = reinterpret_cast<CommunicatorImplLite *>(opHandle);
     182           14 :     CHK_RET(AicpuUtils::GetInstance().RecoverKernelParam(communicatorImplLite, data));
     183            5 :     CHK_RET(AicpuUtils::GetInstance().RestoreOpRes(communicatorImplLite));
     184            5 :     CHK_RET(AicpuUtils::GetInstance().ExecuteOp(communicatorImplLite));
     185              : 
     186              :     // 用于算法编排内存释放
     187            5 :     unique_lock<std::shared_timed_mutex> handlerLock(AicpuUtils::GetInstance().handlerMutex_);
     188            5 :     AicpuUtils::GetInstance().kernelParam_->op.algOperator.scratchMem = nullptr;
     189            5 :     handlerLock.unlock();
     190            5 :     return HCCL_SUCCESS;
     191            5 : }
     192              : } // namespace Hccl
        

Generated by: LCOV version 2.0-1