
GetLogicalOrsMaxMinTmpSize 详解如何为 LogicalOrs 选对临时空间大小【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit在昇腾 Ascend C 算子开发里Kernel 侧的LogicalOrs接口跑起来之前往往需要先定好一块临时空间——这块空间要写进 Tiling 参数、一路传到算子内部使用。GetLogicalOrsMaxMinTmpSize就是专门帮你算出这块临时空间该留多大的 Host 侧 Tiling 接口一次调用返回maxValue上限和minValue下限两个数让你在被称作 UB 的有限片上资源里挑一个既能算对、又能更快跑完的尺寸。它到底解决了什么问题UBUnified Buffer是 AI Core 上的一块共享内存大小是固定的还要和输入、输出、其它缓冲区挤在一起。Kernel 侧做数学计算时有时需要额外的临时空间来存放中间结果但临时空间不是越大越好会挤占别人也不是随便给就够。于是就有了这套先问后拿的套路Host 侧在生成 Tiling 数据时先调用GetXxxMaxMinTmpSize拿到所需临时空间的上下限再结合 UB 当前还剩多少落一个既不低于下限、又不浪费的尺寸把这个尺寸写进 Tiling 数据Kernel 侧读出来、据此InitBuffer。GetLogicalOrsMaxMinTmpSize负责的就是LogicalOrs这一个接口的问环节。快速上手30 秒拿到临时空间上下限下面是最短可跑的片段假设要对 1024 个half元素做或运算#include vector #include adv_api/math/logical_ors_tiling.h #include tiling/platform/platform_ascendc.h std::vectorint64_t dims {1024}; // 输入 shape AscendC::TensorShape shape(dims); // 用 TensorShape 描述输入形状 uint32_t maxValue 0, minValue 0; auto plat platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); AscendC::GetLogicalOrsMaxMinTmpSize(plat, shape, 2, false, maxValue, minValue); // 调用后minValue 是下限、maxValue 是上限单位都是字节跑完这一句你就知道了要保证LogicalOrs算得对临时空间不能小于minValue如果想更快可以在minValue ~ maxValue之间往上取。参数逐项拆解每个输入该填什么函数原型如下void GetLogicalOrsMaxMinTmpSize( const platform_ascendc::PlatformAscendC ascendcPlatform, const AscendC::TensorShape srcShape, const uint32_t typeSize, const bool isReuseSource, uint32_t maxValue, uint32_t minValue);参数方向该怎么填坑点ascendcPlatform输入平台信息由PlatformAscendC构造一般来自context-GetPlatformInfo()接口内部会据此判断 NPU 架构是否受支持srcShape输入输入数据的形状类型是AscendC::TensorShape用维度向量构造维度要和真实输入一致否则查出的空间不准typeSize输入元素类型占多少字节half/bfloat16传 2float/int32传 4int8/uint8传 1int64传 8只支持 1/2/4/8传别的会被参数校验拦下isReuseSource输入预留参数固定传false别自己发挥填false即可maxValue输出计算所需的最大临时空间字节见下一节它只是参考值minValue输出计算所需的最小临时空间字节低于它正确性没保障maxValue 与 minValue读对这两个输出这两个数是理解整个接口的关键边界语义要拎清楚minValue是正确性底线。要算得对前提是给出去的临时空间不能小于它。minValue为 0说明这次计算根本不需要额外临时空间。maxValue是性能天花板。在minValue ~ maxValue区间内临时空间越大Kernel 侧单次能摊到的计算量越大性能通常有一定提升。maxValue为 0 表示计算不依赖临时空间。maxValue只是参考值别照单全收。它有可能比 UB 当前剩余的空间还大真到那一步你得按 UB 实际还剩多少来收窄尺寸而不是硬套maxValue。换句话说minValue管能不能算对maxValue管能不能更快而真正落多少要由你结合 UB 剩余空间来定。如何选对尺寸从下限到上限的取舍推荐的落子方式是把上限和UB 剩余两者取小uint64_t ubFree 0; // 注意这里要用UB 扣除输入输出后真正剩给临时空间的部分 plat.GetCoreMemSize(platform_ascendc::CoreMemType::UB, ubFree); uint32_t tmpSize (ubFree maxValue) ? maxValue : static_castuint32_t(ubFree);取舍逻辑很清楚先看minValue这是不可突破的下限想更快就往maxValue靠拢但别越过 UB 实际能给的空间——maxValue只是接口想要多少不是你能给多少。当 UB 很紧张时宁可贴着minValue给把空间让给输入输出当 UB 宽裕、又在意吞吐时取到maxValue或被剩余空间封顶后的值性能更好。衔接 Kernel把查到的尺寸写进 Tiling 数据查到的tmpSize不会自己飞进算子得走一遍 Tiling 数据Host 侧把tmpSize写进你自定义的 Tiling 结构例如tmpBufferSize字段再SaveToBufferKernel 侧读 Tiling 数据用这个尺寸给临时缓冲InitBuffer再AllocTensor/Get出来交给LogicalOrs使用。这套Host 问 → 写 Tiling → Kernel 用的闭环同族接口Asin、Acos等都是同一套打法完整流程可参考 数学计算更多样例 与 LogicalOrs 接口说明。边界情况与常见疑问当前实现下maxValue、minValue会是多少在受支持架构下LogicalOrs的这个接口两者都返回 0意味着这次或运算本身不额外占临时缓冲。即便如此按先查范围、再定 Tiling的通用流程写代码仍是好习惯能让你的 Tiling 对同族接口保持一致。哪些架构受支持接口内部只放行 DAV_3510 与 DAV_9201其它架构会触发断言并直接返回调用前心里有数。typeSize传错会怎样只接受 1、2、4、8 字节传其它值会被参数校验拦下half记得传 2别误传 4。isReuseSource要不要研究一下它是预留位固定传false现阶段不用纠结。函数本身返回void结果全靠maxValue、minValue这两个出参带出来——记住它只管问出上下限真正落多少尺寸、怎么写进 Tiling是你基于 UB 剩余空间做的决策。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考