☰
AscendC GetFmodMaxMinTmpSize 详解:为 Fmod 预留合适大小的临时空间
2026/10/23 1:53:55 网站建设 项目流程

AscendC GetFmodMaxMinTmpSize 详解:为 Fmod 预留合适大小的临时空间

【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS

在昇腾平台做算子开发时,kernel 侧的 Fmod 计算依赖一块临时空间,这块空间必须在 host 侧提前规划。GetFmodMaxMinTmpSize是 AscendC 提供的辅助接口,用于在 host 侧算出 Fmod 所需临时空间的最小值与最大值。需要为 Fmod 算子编写 Tiling 逻辑的开发者,可以靠它来决定实际预留多少空间,既保证结果正确,又不浪费 Unified Buffer。

为什么临时空间要在 host 侧先算好

这一节回答:临时空间为什么要 host 侧介入、它又是怎么传到 kernel 侧的。

kernel 侧执行 Fmod(逐元素求余)时,需要一块临时缓冲区来存放中间数据。这块缓冲区不能由 kernel 自己随意申请,而要在 Tiling 阶段统一规划。GetFmodMaxMinTmpSize就在 host 侧完成这个规划:它依据输入 shape 和元素字节数,算出所需空间的下限(minValue)与上限(maxValue)。开发者从区间里选定一个实际大小,再以 Tiling 参数下发到 kernel 侧,kernel 据此使用这块缓冲区。

GetFmodMaxMinTmpSize 函数原型与参数

这一节回答:接口怎么声明、每个参数填什么。

void GetFmodMaxMinTmpSize(const ge::Shape& srcShape, const uint32_t typeSize, const bool isReuseSource, uint32_t& maxValue, uint32_t& minValue)
参数方向说明
srcShape输入待求余数组的 shape,按算子实际输入的维度填写。
typeSize输入单个元素的字节数,half 型填 2,float 型填 4。
isReuseSource输入保留参数,当前无实际作用,固定填 false 即可。
maxValue输出Fmod 跑完计算所需临时空间的上限,超出部分不会被接口使用;返回 0 表示该 shape 下不需要临时空间。
minValue输出Fmod 正确完成计算所需临时空间的下限,是必须满足的底线;返回 0 表示不需要临时空间。

Fmod 临时空间怎么预留

这一节回答:拿到 maxValue 和 minValue 之后,实际该给多少空间。

建议按下面的顺序决策:

  1. 先确认 minValue。它是正确性的下限,实际预留空间不能比它小,否则 Fmod 的结果可能出错。
  2. 再确认 maxValue。它是性能上探的空间上限,接口不会使用超过这个值的空间,给多了只会白白占用 Unified Buffer。
  3. 对齐 Unified Buffer 剩余空间。maxValue 只是参考值,可能比 Unified Buffer 剩余空间还大。这时要以 Unified Buffer 剩余空间为准往下收,但收完仍要守住 minValue。
  4. 在可行区间内尽量给大。minValue 到 maxValue 之间,临时空间越大,kernel 侧 Fmod 的性能通常越好。在内存允许时,偏向取大值。
  5. 处理 0 值。若 minValue 为 0,说明该 shape 下不需要额外临时空间,可直接跳过预留。

✅ 一句话总结:实际预留空间落在[minValue, min(maxValue, Unified Buffer 剩余空间)]区间内即可;区间越宽,越能往大里取,性能收益也越高。

GetFmodMaxMinTmpSize 调用示例

这一节给一段可直接跑的代码,并解释每个取值的来由。

// shape 为一维 1024:输入共 1024 个元素 std::vector<int64_t> shape_vec = {1024}; ge::Shape shape(shape_vec); // 输出参数初始化为 0,以引用形式传入,调用后由接口回填 uint32_t maxValue = 0; uint32_t minValue = 0; // typeSize 传 2:half 类型每个元素占 2 字节 // isReuseSource 传 false:保留参数,不允许修改源操作数 AscendC::GetFmodMaxMinTmpSize(shape, 2, false, maxValue, minValue);

几个取值说明:

  • shape_vec = {1024}:输入是一维 1024 个元素,按实际算子输入维度改即可。
  • typeSize = 2:输入数据类型是 half,每个元素占 2 字节,所以这里填 2。
  • isReuseSource = false:该参数为保留项,默认填 false,表示不允许改动源操作数。

常见疑问与注意事项

本节回答:实际开发中容易踩的坑有哪些。

📌下限是硬约束。预留空间小于 minValue 时,Fmod 计算可能得不到正确结果,所以下限不能突破。

⚠️maxValue 只是参考值。它有可能大于 Unified Buffer 剩余空间,最终预留要以 Unified Buffer 剩余空间为上限做收敛,但仍需守住 minValue。

✅isReuseSource 保持 false。该参数目前仅作占位,不需要按实际业务场景改动。

  • 返回 0 的含义:maxValue 或 minValue 为 0,都表示该 shape 下 Fmod 不需要额外临时空间,可直接跳过预留逻辑。

延伸阅读

  • 更多端到端调用样例可参考 CANN 开发套件中的"更多样例"文档,其中覆盖了 Fmod 及其配套 Tiling 接口的完整用法。

【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询