GetFmodMaxMinTmpSize:host 侧查询 Fmod 核函数的临时空间上下限
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
为什么要在 host 侧先算一遍 📌
开发 Fmod(逐元素取模)算子时,核函数要靠一块芯片上的临时空间才能把计算做完。申请多少却是个麻烦事:给少了,结果直接算错;给多了,又挤占 Unified Buffer(芯片上供各算子共用的共享存储),把别的算子逼进角落。
GetFmodMaxMinTmpSize 接的正是"先估算"这一步:你在 host 侧把输入形状和元素大小告诉它,它回传核函数所需的临时空间下限与上限。拿这两个数去定传给核函数的 Tiling(分块处理)参数,就不用靠猜。
函数签名怎么读
void GetFmodMaxMinTmpSize(const ge::Shape& srcShape, const uint32_t typeSize, const bool isReuseSource, uint32_t& maxValue, uint32_t& minValue);一句话读法:前三个是输入(形状、元素字节数、源复用开关),后两个是引用型输出,空间上限、下限分别写回其中。
参数速查:每个入参管什么
| 参数 | 方向 | 类型 | 说明 |
|---|---|---|---|
| srcShape | 入 | const ge::Shape& | 输入张量的维度信息,如 {1024} 表示 1024 个元素 |
| typeSize | 入 | const uint32_t | 每个元素占多少字节,half 传 2、float 传 4 |
| isReuseSource | 入 | const bool | 预留开关,传默认值 false |
| maxValue | 出 | uint32_t& | 核函数可用临时空间的上限,0 表示用不到 |
| minValue | 出 | uint32_t& | 算对结果所需空间下限,分配不能低于它 |
返回值与边界 ⚠️
- 无返回值,结果全部经由引用写回 maxValue 与 minValue。
- minValue 是硬下限,空间给少了,正确性没法保证。
- maxValue 只是参考值,它可能超过 Unified Buffer 的剩余空间,届时按剩余量截断即可。
- 两者同时为 0,说明核函数不占任何临时空间就能完成。
最小可跑示例
前提:输入为 1024 个元素的一维张量,元素类型 half(2 字节),源操作数不复用,故 isReuseSource 取 false。
// 1024 个元素,half 每元素 2 字节,源操作数不复用 std::vector<int64_t> dims = {1024}; ge::Shape src(dims); uint32_t maxBytes = 0; // 由接口回填的空间上限 uint32_t minBytes = 0; // 由接口回填的空间下限 AscendC::GetFmodMaxMinTmpSize(src, 2, false, maxBytes, minBytes);选型与性能提示 ✅
空间下限怎么定
minBytes 就是保底线:你申请的临时空间只要不低于它,计算结果就有保障。
空间加大能快多少
在下限到上限之间,空间取得越大,核函数跑得越快,只是提升幅度有限,不必一味拉满。
实操顺序:先按 minBytes 把正确性锁住,再看 Unified Buffer 还剩多少余量,能放到 maxBytes 最好,放不下就按余量取。另外,maxBytes 为 0 表示 Fmod 用不到临时空间,此时什么都不必申请。
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考