LCOV - code coverage report
Current view: top level - legacy/ascend910/framework/communicator/impl/aclgraph - zero_copy_acl_graph.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 39.2 % 97 38
Test Date: 2026-08-18 17:47:01 Functions: 44.4 % 9 4

            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
        

Generated by: LCOV version 2.0-1