2026/9/19 11:17:55

PyPTO Tensor 缓存策略查询:pypto.Tensor.get_cache_policy 用法与底层实现解析

PyPTO Tensor 缓存策略查询:pypto.Tensor.get_cache_policy 用法与底层实现解析 PyPTO Tensor 缓存策略查询pypto.Tensor.get_cache_policy 用法与底层实现解析【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto导读本文围绕 CANN PyPTO 的 Tensor 缓存策略查询接口pypto.Tensor.get_cache_policy展开说明如何判断某个缓存策略如 PREFETCH 预取、NONE_CACHEABLE 不缓存在当前张量上是否被启用。通过本文你将掌握该 API 的函数签名、参数与返回值约定、与set_cache_policy的配套使用方式并理解其从 Python 层到 C 存储层RawTensor的完整调用链以及缓存策略在 L2 缓存调度中的实际作用。产品支持情况根据 pypto-Tensor-get_cache_policy.md 中的产品支持说明get_cache_policy在以下产品上受支持产品系列支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持功能说明get_cache_policy用于获取某个缓存策略是否被启用即查询张量上标记的缓存策略开关状态。该接口本身只做查询不改变任何状态配合set_cache_policy使用可以实现先设置、后查询的缓存策略管理流程。缓存策略的典型应用场景包括在算子执行前将输入张量预取到 L2 缓存PREFETCH或标记某些张量不进入缓存NONE_CACHEABLE用于带宽敏感或避免缓存污染的场景。函数原型get_cache_policy(self, policy: CachePolicy) - bool参数说明参数名输入/输出说明policy输入缓存策略类型取值为pypto.CachePolicy枚举成员。CachePolicy枚举定义于 C 层 data_type.henum class CachePolicy { PREFETCH, NONE_CACHEABLE, MAX_NUM };PREFETCH标记该张量在计算前被预取到 L2 缓存预取张量数量上限为 4NONE_CACHEABLE标记该张量不进入缓存通常用于函数输入/输出张量MAX_NUM作为内部边界占位值用于数组维度计算不直接作为查询参数。Python 侧通过 enum.py 将 C 枚举导出为pypto.CachePolicy并在 pypto_impl/init.pyi 中声明了类型存根方便 IDE 提示与类型检查。注意Python 层暴露的枚举成员为NONE_CACHEABLE即 C 的NONE_CACHEABLE而PREFETCH与文档调用示例中的用法一致。返回值说明返回bool类型表示指定的CachePolicy是否被启用True该缓存策略已启用False该缓存策略未启用默认状态。从 C 实现看查询结果直接读取张量存储内部维护的缓存策略标志位见下文底层实现。约束说明从 API 使用层面看本接口本身无额外约束。需要说明的底层约束是PREFETCH与NONE_CACHEABLE两种策略不能同时应用在同一个张量上见 raw_tensor.h 的互斥检查此外根据 tensor.h 的注释NONE_CACHEABLE只对函数输入张量生效对输出张量的影响有限。这些约束在调用get_cache_policy查询时体现为一旦设置时发生冲突冲突策略会被置回false查询结果即返回False。调用示例基础用法创建张量并查询PREFETCH策略是否启用import pypto t pypto.tensor((16, 16), pypto.DT_FP32) out t.get_cache_policy(pypto.CachePolicy.PREFETCH)结果示例如下输出数据out: False默认情况下张量未标记任何缓存策略因此查询返回False。与 set_cache_policy 配套使用get_cache_policy通常与set_cache_policy配合先设置策略再查询验证import pypto t pypto.tensor((16, 16), pypto.DT_FP32) # 先设置 PREFETCH 策略 t.set_cache_policy(pypto.CachePolicy.PREFETCH, True) # 再查询策略是否生效 print(t.get_cache_policy(pypto.CachePolicy.PREFETCH)) # True print(t.get_cache_policy(pypto.CachePolicy.NONE_CACHEABLE)) # False # 关闭策略 t.set_cache_policy(pypto.CachePolicy.PREFETCH, False) print(t.get_cache_policy(pypto.CachePolicy.PREFETCH)) # False底层实现与调用链Python 层入口Tensor.get_cache_policy定义于 tensor.py是对 C 绑定层pypto_impl.Tensor.GetCachePolicy的薄封装def get_cache_policy(self, policy: CachePolicy) - bool: return self._base.GetCachePolicy(policy)其中self._base是pypto_impl.Tensor对象GetCachePolicy的绑定签名声明在 pypto_impl/init.pyi。C 存储层实现调用链继续下沉到存储层tensor.cppTensor::GetCachePolicy将查询转发给存储对象storage_logical_tensor.hLogicalTensor::GetCachePolicy继续转发到底层tensorraw_tensor.h最终读取RawTensor内部的cachePolicy_数组bool GetCachePolicy(CachePolicy policy) const { return cachePolicy_[static_castint(policy)]; }cachePolicy_以CachePolicy::MAX_NUM为维度初始化为全false表示张量默认不带任何缓存策略标记。设置侧的互斥逻辑SetCachePolicy在 raw_tensor.h 中实现了策略互斥当尝试同时启用PREFETCH与NONE_CACHEABLE时会打印警告日志Prefetch and non-cacheable cannot be applied at the same time; using the first config policy.并将后设置的策略回滚为false。因此若在设置时发生冲突get_cache_policy对冲突策略的查询结果会是False。缓存策略在调度中的实际作用get_cache_policy查询到的策略标志并非仅用于状态展示而是会参与宿主编译/调度的 L2 预取信息填充。在 backend.cpp 的FillL2PrefetchInfo函数中对每个函数输入张量若GetCachePolicy(CachePolicy::PREFETCH)返回True则将张量的内存大小与索引加入l2InfoListL2 预取列表见L2Info的构建对输入与输出张量若GetCachePolicy(CachePolicy::NONE_CACHEABLE)返回True则将对应的disableL2List置 1表示该张量不进入 L2 缓存。这说明缓存策略最终影响的是运行时对张量数据在 L2 缓存层面的预取与禁用决策属于面向性能优化的调度元数据。单元测试验证仓库中的单元测试 test_tensor.cppGetCachePolicyTest完整覆盖了查询与互斥行为TEST_F(TestTensor, GetCachePolicyTest) { std::vectorint64_t tshape {4, 4}; Tensor t1(DT_FP32, tshape, T1); EXPECT_FALSE(t1.GetCachePolicy(CachePolicy::PREFETCH)); EXPECT_FALSE(t1.GetCachePolicy(CachePolicy::NONE_CACHEABLE)); t1.SetCachePolicy(CachePolicy::PREFETCH, true); EXPECT_TRUE(t1.GetCachePolicy(CachePolicy::PREFETCH)); EXPECT_FALSE(t1.GetCachePolicy(CachePolicy::NONE_CACHEABLE)); t1.SetCachePolicy(CachePolicy::NONE_CACHEABLE, true); EXPECT_TRUE(t1.GetCachePolicy(CachePolicy::PREFETCH)); EXPECT_FALSE(t1.GetCachePolicy(CachePolicy::NONE_CACHEABLE)); }该测试验证了三个关键行为新建张量的两种策略查询默认均为False设置PREFETCH后查询PREFETCH返回True试图叠加设置NONE_CACHEABLE时由于与PREFETCH互斥NONE_CACHEABLE被回滚查询仍为False而PREFETCH保持True即使用第一个配置的策略。总结pypto.Tensor.get_cache_policy(policy)是 PyPTO 中查询张量缓存策略开关的轻量接口入参为pypto.CachePolicy枚举PREFETCH/NONE_CACHEABLE返回bool默认所有策略均为False需配合set_cache_policy使用底层由RawTensor::cachePolicy_数组承载状态查询不产生副作用策略标志最终影响宿主编译期的 L2 预取列表与禁用 L2 列表的生成是性能调优的重要元数据PREFETCH与NONE_CACHEABLE互斥冲突时后设置的策略会被忽略可用get_cache_policy验证实际生效状态。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考