Pull Request已成功合入, 合并人@CANN-robot
(感谢 kantao1 的贡献)变更摘要
该 PR 旨在为 tiling 流程新增“PCIe 直通(PCIe Through)”支持:通过在算子属性、全局配置、tiling 上下文固定输入和执行期判定等环节传递并校验 pcie through 标志,使得仅当平台支持且算子输入地址落在 host-device 地址范围内时,才真正启用 PCIe 直通。改动主要涉及属性定义与配置项、图管理阶段标记、tiling 上下文构建器的输入扩展,以及 RT2/Runtime v2 执行路径中的标志解析与更新。
主要改动
-
新增属性与全局配置项: 在
ge_attr_define中新增ATTR_NAME_PCIE_THROUGH、ATTR_NAME_PCIE_THROUGH_FLAG属性,并在ge_common_api_types.h中新增配置项OPTION_EXEC_DISABLE_PCIE_THROUGH(ge.exec.disable_pcie_through),同时将其加入option_supportion_checker的全局选项校验集合。 -
图管理阶段标记算子: 新增
GraphManager::ProcessPcieThrough,遍历计算图节点,通过OpImpl::IsSupportPcieThrough()判断算子是否支持 PCIE 直通,并为其设置ATTR_NAME_PCIE_THROUGH与ATTR_NAME_PCIE_THROUGH_FLAG属性;该步骤在PreRunOptimizeSubGraph中先于ProcessNullableOutput执行。 -
扩展 tiling 上下文固定输入:
TilingContextBuilder与DeviceTilingContextBuilder新增SetPcieThroughFlag方法及pcie_through_flag_成员,在原有确定性标志之后追加第m + 5个固定输入用于传递直通标志;同时op_tiling_py.cc将kTilingCtxFixedInputSize调整为6,新增kPcieThroughOffset并解析 compile info 中的pcie_through_flag。 -
RT2 路径中的直通判定: 在
op_tiling_rt2.cc新增IsPcieThroughEnabled与DeterminePcieThroughFromInputs,通过aclrtHostGetDevicePointerAddrRange判断算子输入地址是否位于 host-device 地址范围,并在RtParseAndTiling中据此更新 tiling 上下文对应固定输入的值。 -
Runtime v2 执行路径联动:
bg_tiling.cc新增BuildTilingPcieThroughInput,将直通标志作为 tiling 输入追加到各类 tiling 构建路径;tiling.cc新增UpdatePcieThroughFlag,在执行TilingProc/CacheableTilingProc前重新校验实际标志,并将其纳入BuildGeneralTilingCacheKey的缓存键计算。


/lgtm


Pull Request
接口评审时间:2026/08/06(周四)
描述
PCIE Through 是 Ascend NPU 硬件能力,允许 device 端算子通过 PCIE 总线直接访问 host 内存。当前单算子场景可用,但在模型编译场景下,编译期无法确定输入 tensor 的真实的地址范围,导致 tiling 阶段无法选择正确 kernel。
本特性通过编译期能力识别 + TilingContext 注入 + 执行期上下文扩展(动态 shape),解决此问题。
核心设计
编译阶段(lowering):
BuildTilingPcieThroughInput从DefaultOpImplSpaceRegistryV2查询算子是否支持 PCIe Through,同时通过IsPcieThroughEnabled检查运行环境(option 开关、芯片能力、设备连接类型),两者均满足时将pcie_through_flag初始值设为 trueIsPcieThroughEnabled结果通过thread_local static缓存,每个线程仅计算一次BuildTilingCommonInputs在input_addrs可用时,通过BuildRefTensor将输入从StorageShape升级为包含设备地址的Tensor,使运行时能通过GetInputTensor(i)->GetAddr()获取实际输入地址运行时(executor):
UpdatePcieThroughFlag读取pcie_through_flag,为 false 时直接跳过;为 true 时通过IsAnyInputInPcieRange遍历输入地址,检查是否落在 PCIe 地址范围内GetPcieThroughFlag()接口供 Tiling 函数和缓存键计算使用关键修复:
fwk_data_idx恢复后向计算(input_num - kFwkDataOffset),修复 symbol tiling 路径中前向计算导致的 702 行 ASSERT 失败GetPcieThroughFlag改为后向GetInputNum() - 1,与 pcie_through_flag 作为最后一个输入的布局一致TilingForAtomic补充BuildTilingPcieThroughInput调用,保证输入布局一致性BuildGeneralTilingCacheKey简化为直接读GetPcieThroughFlag(),消除运行时查 space_registry 的版本不一致问题变更类型
关联的Issue
如何测试
make -C cmake-build-gcov ut_fast_runtime2_test ut_exe_graph ut_register -j$(nproc)--gtest_filter='*PcieThrough*'--gtest_filter='TilingContextBuilderUT.*'核对清单
其他信息
涉及文件
runtime/v2/graph_builder/bg_tiling.ccIsPcieThroughEnabled、BuildTilingPcieThroughInput;BuildTilingCommonInputs支持 BuildRefTensor;TilingForAtomic补充 pcie through 输入runtime/v2/kernel/common_kernel_impl/tiling.ccIsAnyInputInPcieRange、UpdatePcieThroughFlag;fwk_data_idx恢复后向计算;BuildGeneralTilingCacheKey简化runtime/v2/kernel/common_kernel_impl/tiling.hkPcieThroughFlag枚举项inc/external/exe_graph/runtime/tiling_context.hGetPcieThroughFlag改为后向计算