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
|