Closed
[Bug-Report|缺陷反馈]: [MhcPre] 动态维度 N=-1 转成 uint64 后进入阶乘循环,InferShape 无法终止 #6895
daishuangshuangAdd on 16 days agoClosed at 9 days ago
周云飞
16 days ago Comments:
16 days ago Comments:
您好,感谢提供详细的代码路径和测试设计。
按您贴出的 Factorial 实现,只要 N=-1 未经检查就转换为 uint64_t 并进入该函数,循环就无法正常终止:转换后的值为 UINT64_MAX,i <= n 对所有 uint64_t 值都成立,计数器回绕后仍会继续循环。阶乘结果本身的溢出也不会使循环退出。这属于输入检查与计算顺序上的正确性问题,不以算子是否支持动态 N 为前提。目前这一判断基于报告中的代码片段和 C++ 无符号运算规则,尚无实际 CANN 回调超时结果;目标版本是否完整经过这条调用路径仍需确认。
一个可行的处理方向是:在读取 N 后保留其有符号值,先区分未知维度、其他非法负值和合法静态值,再进行无符号转换及阶乘计算。对于未知 N,若当前推导支持动态维度,应传播相应的未知输出维度,并跳过依赖具体 N 的阶乘计算和形状等式检查;若不支持,则应快速返回失败并给出明确原因。对于静态 N,还需在计算前限制取值范围,同时考虑算子的实际约束和阶乘溢出,不能仅通过修改循环条件避免死循环。
您提出的独立子进程加超时保护适合验证这个问题,可避免异常用例阻塞整组测试。验证时应保留 N=4 的正常对照,并覆盖未知 N、其他非法负值及超范围 N。Ascend 950 和 A2/A3 的实际影响范围,还需结合各平台使用的推导实现确认。


16 days ago Assign liweijian16 as responsible person
15 days ago changed custom category from 任务 to 缺陷
9 days ago Associated pull request
9 days ago Close issue
9 days ago Added label: resolved
1)标题
[Bug][MhcPre] 动态维度 N=-1 转成 uint64 后进入阶乘循环,InferShape 无法终止
2)问题描述
MhcPre InferShape第 134 行把 N 声明为
uint64_t,第 139/142 行直接接收输入 shape 的维度,第 146 行立即计算Factorial(n)。在检查 N 是否为未知维度或有效取值前,已经进入:static uint64_t Factorial(uint64_t n) { uint64_t r = 1; for (uint64_t i = 2; i <= n; ++i) { r *= i; } return r; }当动态 N=-1 时,转换结果为
UINT64_MAX。循环条件始终成立,计数器溢出后还会从 0 继续,导致图形状推导卡住。即使不支持动态 N,也应该返回明确错误,而非进入该循环。3)环境信息
4)重现步骤
x.N=4、phi=[24,16384],比较推导能否正常返回。5)预期结果
发现未知 N 时传播动态维度,或者对当前不支持的动态 N 快速返回失败。InferShape 必须终止,不能因负值转无符号数而长时间占用 CPU。
6)日志截图等
确定的语言层算术与代码路径,非实测超时日志:
定位:
Factorial第 88~95 行;N 赋值及调用第 134~146 行。尚无真实 CANN 超时栈。7)备注
应在转换类型及阶乘计算前检查未知维度和范围。建议同步检查其他负维度及超大 N,不把“支持动态 N”作为修复成立的前提。