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 之后,实际该给多少空间。
建议按下面的顺序决策:
- 先确认 minValue。它是正确性的下限,实际预留空间不能比它小,否则 Fmod 的结果可能出错。
- 再确认 maxValue。它是性能上探的空间上限,接口不会使用超过这个值的空间,给多了只会白白占用 Unified Buffer。
- 对齐 Unified Buffer 剩余空间。maxValue 只是参考值,可能比 Unified Buffer 剩余空间还大。这时要以 Unified Buffer 剩余空间为准往下收,但收完仍要守住 minValue。
- 在可行区间内尽量给大。minValue 到 maxValue 之间,临时空间越大,kernel 侧 Fmod 的性能通常越好。在内存允许时,偏向取大值。
- 处理 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),仅供参考