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 "zero_copy_acl_graph.h"
12 : #include "stream_utils.h"
13 : namespace hccl {
14 810 : ZeroCopyAclGraph::ZeroCopyAclGraph() : tagResourceIndex_(0), retryEnable_(false)
15 : {
16 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_BROADCAST);
17 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_ALLREDUCE);
18 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_REDUCE);
19 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_ALLTOALL);
20 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_ALLTOALLV);
21 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_REDUCE_SCATTER);
22 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_SEND);
23 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_RECEIVE);
24 810 : algoSet_.insert(HcclCMDType::HCCL_CMD_ALLGATHER);
25 810 : }
26 :
27 0 : std::string ZeroCopyAclGraph::GetTagPrefix()
28 : {
29 0 : std::stringstream ss;
30 0 : ss << std::hex << std::uppercase << (tagResourceIndex_++);
31 0 : return ss.str();
32 0 : }
33 :
34 74 : void ZeroCopyAclGraph::SetRetryEnable(bool retryEnable) { this->retryEnable_ = retryEnable; }
35 :
36 27 : bool ZeroCopyAclGraph::IsAclGraphZeroCopyAlgAvailable(HcclCMDType opType, OpParam& opParam)
37 : {
38 27 : bool isReduceOps
39 10 : = (opType == HCCL_CMD_ALLREDUCE || opType == HCCL_CMD_REDUCE || opType == HCCL_CMD_REDUCE_SCATTER
40 37 : || opType == HCCL_CMD_REDUCE_SCATTER_V);
41 : // 非Reduce类算子,不受aclGraphZeroCopyEnable 用户配置值的影响,继续配置AclGraphZeroCopy的算法选择模式
42 27 : if (!isReduceOps == true) {
43 5 : return true;
44 : }
45 :
46 : // 检查用户的Aclgraph配置,如果配置了Aclgraph等于0并且当前是Reduce类算子,则退出AclgraphZeroCopy算法配置流程
47 22 : if (opParam.aclGraphZeroCopyEnable == 1) {
48 : // Reduce 类算子,但是保证性能优先,算法选择和单算自不一致。继续配置AclGraphZeroCopy的算法选择模式
49 2 : return true;
50 : }
51 20 : return false;
52 : }
53 :
54 74 : bool ZeroCopyAclGraph::SetAclGraphZeroCopyMode(
55 : DevType deviceType, HcclCMDType opType, OpParam& opParam, HcclAlg* impl, u64 bufferSize)
56 : {
57 74 : bool isInGraphCaputureZeroCopy = false;
58 74 : aclmdlRI rtModel = nullptr;
59 74 : bool isCapture = false;
60 74 : if (impl == nullptr) {
61 0 : return false;
62 : }
63 :
64 74 : if (deviceType != DevType::DEV_TYPE_910_93) {
65 54 : HCCL_INFO(
66 : "[ZeroCopyAclGraph][SetAclGraphZeroCopyMode] Hccl doesn't support graph zero copy mode. current "
67 : "device is %d not DEV_TYPE_910_93",
68 : deviceType);
69 58 : return false;
70 : }
71 :
72 20 : bool isActivateAddr = ZeroCopyMemoryAgent::IsActivateCommMemoryAddr(opParam.inputPtr, opParam.inputSize)
73 20 : || ZeroCopyMemoryAgent::IsActivateCommMemoryAddr(opParam.outputPtr, opParam.outputSize);
74 20 : if (opParam.isZeroCopy || opParam.supportZeroCopy || opParam.supportSymmetricMemory || isActivateAddr) {
75 0 : HCCL_INFO("[ZeroCopyAclGraph][SetAclGraphZeroCopyMode] Hccl can't support graph zero copy mode and operator "
76 : "zero copy at the same time.");
77 0 : return false;
78 : }
79 20 : if (IsAclGraphZeroCopyAlgAvailable(opType, opParam) == false) {
80 18 : HCCL_INFO("[ZeroCopyAclGraph][SetAclGraphZeroCopyMode] Hccl aclGraph was set disable mode.");
81 18 : return false;
82 : }
83 :
84 2 : GetStreamCaptureInfo(opParam.stream.ptr(), rtModel, isCapture);
85 2 : if (isCapture) {
86 0 : isInGraphCaputureZeroCopy = SetGraphMode(opType, opParam, impl, bufferSize);
87 : }
88 2 : return isInGraphCaputureZeroCopy;
89 : }
90 :
91 0 : bool ZeroCopyAclGraph::SetGraphMode(HcclCMDType opType, OpParam& opParam, HcclAlg* impl, u64 bufferSize)
92 : {
93 0 : if (!opParam.aicpuUnfoldMode
94 0 : || (GetExternalInputHcclAivMode() && (opType == HCCL_CMD_ALLTOALLV || opType == HCCL_CMD_BROADCAST))) {
95 0 : HCCL_INFO(
96 : "[ZeroCopyAclGraph][SetAclGraphZeroCopyMode] Hccl can't support graph zero copy "
97 : "mode. Only support on aicpu mode aicpuUnfoldMode %d aiv %d",
98 : opParam.aicpuUnfoldMode, GetExternalInputHcclAivMode());
99 0 : return false;
100 : }
101 0 : if (IsAlgoSupportAclGraphZeroCopyMode(opType, opParam, impl, bufferSize)) {
102 0 : SetWorkflowMode(HcclWorkflowMode::HCCL_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB);
103 0 : HCCL_INFO(
104 : "[ZeroCopyAclGraph][SetAclGraphZeroCopyMode] Hccl set op %d workflow mode to "
105 : "HCCL_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB "
106 : "graph zero copy mode.",
107 : opType);
108 0 : return true;
109 : }
110 0 : return false;
111 : }
112 :
113 0 : bool ZeroCopyAclGraph::AlgoCheck(OpParam& opParam, std::unique_ptr<CollAlgOperator>& algo, u64 bufferSize)
114 : {
115 0 : std::string algName;
116 0 : std::string newTag;
117 0 : if (opParam.aicpuUnfoldMode) {
118 : // 用于inplace支持重执行判断
119 0 : algo->SetRetryEnable(retryEnable_);
120 : }
121 0 : HcclResult res = algo->SelectAlg(opParam.tag, opParam, algName, newTag);
122 0 : if (res != HCCL_SUCCESS) {
123 0 : HCCL_INFO("[ZeroCopyAclGraph][AlgoCheck] could not select algo. result =%x", res);
124 0 : return false;
125 : }
126 :
127 0 : AlgResourceRequest resRequest;
128 0 : HcclResult ret = algo->CalcResRequest(algName, opParam, resRequest);
129 0 : if (ret == HCCL_SUCCESS) {
130 0 : if (IsScratchMemorySupportAclGraphZeroCopyMode(opParam, bufferSize, resRequest.scratchMemSize)) {
131 0 : opParam.tag = opParam.tag + GetTagPrefix();
132 0 : HCCL_INFO("[ZeroCopyAclGraph][AlgoCheck] scratch support.");
133 0 : return true;
134 : }
135 0 : HCCL_INFO("[ZeroCopyAclGraph][AlgoCheck] could not scratch support.");
136 : } else {
137 0 : HCCL_INFO("[ZeroCopyAclGraph][AlgoCheck] op %d could not calcResRequest.", opParam.opType);
138 : }
139 0 : return false;
140 0 : }
141 :
142 0 : bool ZeroCopyAclGraph::IsAlgoSupportAclGraphZeroCopyMode(
143 : HcclCMDType opType, OpParam& opParam, HcclAlg* impl, u64 bufferSize)
144 : {
145 0 : if (algoSet_.find(opType) != algoSet_.end()) {
146 0 : HcclWorkflowMode oldMode = GetWorkflowMode();
147 0 : SetWorkflowMode(HcclWorkflowMode::HCCL_WORKFLOW_MODE_OPS_KERNEL_INFO_LIB);
148 0 : std::unique_ptr<CollAlgOperator> algo = impl->GetAlgOperator(opType);
149 0 : if (algo == nullptr) {
150 0 : HCCL_INFO("[ZeroCopyAclGraph][IsAlgoSupportAclGraphZeroCopyMode] could not getAlgo.");
151 0 : return false;
152 : }
153 0 : if (AlgoCheck(opParam, algo, bufferSize)) {
154 0 : return true;
155 : }
156 0 : HCCL_INFO("[ZeroCopyAclGraph][IsAlgoSupportAclGraphZeroCopyMode] could not check algo.");
157 0 : SetWorkflowMode(oldMode);
158 0 : }
159 :
160 0 : return false;
161 : }
162 :
163 0 : bool ZeroCopyAclGraph::IsScratchMemorySupportAclGraphZeroCopyMode(
164 : const OpParam& opParam, u64 bufferSize, u64 scratchMemSize)
165 : {
166 0 : if (scratchMemSize <= bufferSize) {
167 0 : HCCL_INFO(
168 : "[ZeroCopyAclGraph] OP %d support acl graph zero copy. scratchmemsize=%ul cclbuffer size=%ul",
169 : opParam.opType, scratchMemSize, bufferSize);
170 0 : return true;
171 : }
172 0 : HCCL_INFO(
173 : "[ZeroCopyAclGraph] OP %d doesn't support acl graph zero copy. scratchmemsize=%ul cclbuffer size=%ul",
174 : opParam.opType, scratchMemSize, bufferSize);
175 0 : return false;
176 : }
177 : } // namespace hccl
|