您好,感谢提供完整的复现步骤和对照结果。
问题分析
按您引用的 Atlas A2、A3 文档约束,c=130 不满足“尾轴为 128 的倍数”的要求。您在 Atlas A2、CANN 9.2.0 环境中报告两阶段均返回 0,这与上述约束不一致,需要进一步确认参数检查的覆盖情况。
两阶段接口返回成功并不能证明非对齐输入的计算结果正确。目前没有数值比对结果,因此不能据此认定已经算错,也不能将 c=130 视为受支持的输入。图模式是否同样放行,以及 kernel 是否依赖该对齐条件,还需要结合对应实现确认。
处理方向
若该对齐约束适用于当前实现,一个可行的处理方案是在第一阶段的 CheckShape 中增加 c % 128 == 0 检查,保留现有取值范围及形状关系检查,并在错误信息中说明实际 c 值和对齐要求。第一阶段应按您提出的预期返回 ACLNN_ERR_PARAM_INVALID(161002),具体错误码还需沿检查失败的返回路径核对。图模式入口也需要考虑等效检查,避免只在 aclnn 接口侧拦截。
若实现确实支持非对齐输入,则需要以对应平台的计算结果验证为依据,再评估是否调整文档,而不能仅凭接口返回成功扩大支持范围。在支持范围明确前,建议调用方继续使用满足文档约束的 c 值,不直接依赖 c=130 的执行结果。


已提交修复 PR:https://gitcode.com/cann/ops-transformer/merge_requests/14770
修复内容:CheckShape 补充 c % 128 == 0 校验(返回 161002,错误信息带实际 c 值),门控于非 TND 平台(A2/A3,与文档规格约束的 npu="A3,910b" 范围一致);950/960DT 的 TND 路径不受影响。
实机验证(910B3,cann/master 未修复版与本分支 A/B):c=130 由 0(放行)→ 161002,c=128 回归不受影响。


现象
aclnnMhcPreSinkhorn对尾轴c不做 128 对齐校验:c=130时两段接口均返回成功并继续执行。(1, 8, 4, 128)(1, 8, 4, 130)资料写明尾轴必须为 128 的倍数,实测非对齐输入既不报错也不拦截。
期望
docs/aclnnMhcPreSinkhorn.md「约束说明 / 规格约束」(Atlas A2、A3 段)原文:按该约束,
c=130应在第一段aclnnMhcPreSinkhornGetWorkspaceSize返回 161002(ACLNN_ERR_PARAM_INVALID)。环境
92d0f9c2(git fetch后确认校验缺失仍在)复现步骤
cp examples/test_aclnn_mhc_pre_sinkhorn.cpp repro.cppint64_t bs = 1, seq_len = 8, n = 4, c = 130;(phi_shape由c自动推导,无需改动)./repro,程序打印c=130 ACCEPTED (rc1=0 rc2=0)c改回128重编译运行,同样打印rc1=0 rc2=0(对照组,行为正确)复现脚本
cp examples/test_aclnn_mhc_pre_sinkhorn.cpp repro.cpp sed -i 's/int64_t bs = 2, seq_len = 128, n = 4, c = 4096;/int64_t bs = 1, seq_len = 8, n = 4, c = 130;/' repro.cpp g++ -std=c++17 -O2 repro.cpp -o repro \ -I${ASCEND_HOME_PATH}/include -L${ASCEND_HOME_PATH}/lib64 \ -Wl,--allow-shlib-undefined -lascendcl -lnnopbase -lopapi ./repro实测输出:
c=128对照组输出:影响
.cpp逻辑,尾轴对齐是 kernel 侧搬运/切块的前提,非对齐输入被放行后输出正确性没有保障;本轮无 CPU 标杆,未判定是否算错,只确认校验缺失。c构造不会得到任何提示,问题会推迟到数值比对阶段才暴露,定位成本高。op_host/op_api/aclnn_mhc_pre_sinkhorn.cpp的CheckShape与op_host/op_tiling/均无c % 128判断),图模式通路同样缺失。建议
在
CheckShape中补c % 128 == 0判断,报ACLNN_ERR_PARAM_INVALID(161002)并带上实测c与约束值;若实现实际支持任意c,则同步修订资料的支持面并补充对应精度用例。