已关闭
[Bug-Report|缺陷反馈]: TopK/Sort Tiling 存在 int64->uint32 隐式收窄,超大维度可能溢出导致调度错误 #1514
CodeSail创建于 5月11日关闭于 6月22日
BruceLP
5月12日 评论:
5月12日 评论:
您好,感谢关注、使用和提出建议。后续将对Topk/Sort算子中数据类型隐式收窄问题进行整改,验证成熟后,将会合入上库和发布,敬请期待。


6月22日 关闭了 issue
6月22日 添加了label:resolved
您好,感谢关注、使用和提出建议。后续将对Topk/Sort算子中数据类型隐式收窄问题进行整改,验证成熟后,将会合入上库和发布,敬请期待。


Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
一、问题描述
TopK/Sort 算子Tiling调度核心逻辑中,输入维度是int64_t的,但中间计算变量是uint32_t,混用可能产生问题,存在高频隐式收窄转换,属于大模型部署场景隐蔽问题:
在维度累乘、分块数、核数、workspace 大小等关键调度值使用 uint32_t 存储;
超大Batch和超长序列场景下,当计算结果超过uint32最大值,会产生溢出截断;
二、涉及文件与代码位置
文件位置:math\top_k_v2\op_host\arch35\top_k_v2_tiling_arch35.cpp
top_k_v2_tiling_arch35.cpp 行号:1197-1200
uint32_t unsortedDimNum = 1; for (uint32_t i = 0; i < (inputDimNum - 1); i++) { unsortedDimNum *= inputShape.GetDim(i); }行号:185-187
uint32_t lastDimTileNum = (static_cast<uint32_t>(lastAxisNum) + tileData - 1) / tileData; uint32_t lastDimTileNumTimes = (lastDimTileNum + maxCoreNum - 1) / maxCoreNum; uint64_t initUb = indexDtypeSize * topkV2DataInfo::BIN_NUM * (lastDimTileNumTimes + 1) +...行号:499-500
uint32_t lastDimTileNum = (lastAxisNum + tileData - 1) / tileData; uint32_t inputTopkSize = kValue * lastDimTileNum;行号:516-519
uint32_t lastDimTileNum = (lastAxisNum + nowTileSize - 1) / nowTileSize; uint32_t tileNum = lastAxisNum / lastDimTileNum; uint32_t tailTileNum = lastAxisNum % lastDimTileNum; tileNum = tailTileNum == 0 ? tileNum : tileNum + 1;2. Sort 中 sortAxisNum 参与 uint32_t 运算
sort_tiling_arch35.cpp 行号:285-289
uint32_t xUbSize = sortTileInfo.sortAxisNum * sortTileInfo.dtypeSize; xUbSize = CeilDivMul<uint32_t>(int64_t(xUbSize), int64_t(sortTileInfo.blockUbSize)); uint32_t y2UbSize = sortTileInfo.sortAxisNum * static_cast<uint32_t>(sizeof(int32_t)); y2UbSize = CeilDivMul<uint32_t>(int64_t(y2UbSize), int64_t(sortTileInfo.blockUbSize)); uint32_t halfNum = y2UbSize / static_cast<uint32_t>(sizeof(int32_t));三、建议修改方式
个人在开发中也遇到过类似的问题,类型转换属于比较隐蔽,且不易排查的,尽可能避免超大维度溢出导致调度错误,检查转换情况是否符合预期。可能产生数值溢出、类型安全、算法调度错误。
四、排查意义
避免数值溢出、内存越界、算子崩溃、NaN/Inf 等隐蔽问题。
这个math库属于基本库且常用,检查是否符合大模型算子类型安全规范,提升这个math库整体稳定性。