Open
[Documentation|文档反馈]: aclnnGer 资料自相矛盾::86/:96/:106 三行 dtype 均列 BFLOAT16,:135 设备注却写 A2 不支持;且 out 行 BF16 无法靠输入侧推出来,该列实际不可用 #4311
liuhanwen8Add on 11 days ago
11 days ago Change title to "[Documentation|文档反馈]: aclnnGer 资料自相矛盾::86/:96/:106 三行 dtype 均列 BFLOAT16,:135 设备注却写 A2 不支持;且 out 行 BF16 无法靠输入侧推出来,该列实际不可用", originally titled "[Bug-Report|缺陷反馈]: aclnnGer out 为 BF16 时在 Atlas A2 被接受(资料声明 A2 不支持 BF16),而 BF16 作输入被正确拒绝".
11 days ago Change title to "[Documentation|文档反馈]: aclnnGer 资料自相矛盾::86/:96/:106 三行 dtype 均列 BFLOAT16,:135 设备注却写 A2 不支持;且 out 行 BF16 无法靠输入侧推出来,该列实际不可用", originally titled "[Bug-Report|缺陷反馈]: aclnnGer out 为 BF16 时在 Atlas A2 被接受(资料声明 A2 不支持 BF16),而 BF16 作输入被正确拒绝".
11 days ago Modify description of issue
陈思
10 days ago Comments:
10 days ago Comments:
您好,感谢反馈!这页的设备注确实没有清楚区分输入类型限制与输出转换范围;您给出的 BF16 输入被拒、FP32 输入配 BF16 输出成功这两组结果,需要分别说明。
问题分析
我们核对了 cann/ops-math 提交 212ce9d5460b1be26cfbee481aff1acbf5cc5c62,其中该接口实现和文档与您报告的 9a37afeb6 一致。输入检查在非 RegBase 分支仅对 self、vec2 使用不含 BFLOAT16 的白名单,因此 A2 的 BF16 输入被拒符合这段实现;out 则检查推导计算类型能否转换到指定输出类型。
out 无须等于输入推导得到的类型。执行流程会先按推导类型计算外积,再将结果 Cast 到 out 类型。例如两个 FP32 输入可以先得到 FP32 结果,再转成 BF16 输出,无需先推导出 BF16。文档链接的互转换规则也允许浮点类型之间转换。这解释了您报告的 in=fp32 out=bf16 成功,因此 out 列的 BF16 有实际转换用途。
调整方向
一个可行的修订方向是分别写明 self/vec2 的平台输入限制,以及 out 从计算结果转换得到的范围,并将设备注的作用对象标清。将三个参数一律写成不支持 BF16,或限定只有输入可用 BF16 时才能选择 BF16 输出,会与现有输出转换路径产生新的不一致。
输出转换还需保留数据类型转换规则和精度边界:您验证的 3.0 可被 BF16 精确表示,一般 FP32 结果转 BF16 会涉及舍入。我们会继续确认各产品版本的输出支持口径,评估如何消除该页的范围歧义。


10 days ago Assign chen_0715 as responsible person
10 days ago Added label: pending-confirmation
8 days ago Removed label: pending-confirmation
7 days ago Assign m0_55003149 as responsible person
7 days ago Removed responsible person chen_0715
7 days ago Associated pull request
涉及条目
math/ger/docs/aclnnGer.md/ 接口aclnnGer/ dtype 声明面(三处列表 + 一处设备注)原文片段
参数表
self(第 86 行)、vec2(第 96 行)、out(第 106 行)的「数据类型」列逐字相同:参数表之后的设备注(第 135 行):
out行的「使用说明」列(第 105 行)写的是:问题
两处自相矛盾,且其中一处导致
out列的 BFLOAT16 在 A2 上根本不可能被用到:第 86/96/106 行 vs 第 135 行:三行 dtype 列表都写了
BFLOAT16,但同一页的设备注说A2 / A3 / Atlas训练 都不支持 BFLOAT16。设备注只在 A2 上生效(950 走 regbase 分支),
等于「列表说支持、注脚说不支持」,读者无法判断该信哪个。
out行的 BFLOAT16 是死条目:资料自己规定 out 必须是「self 与 vec2 推导后可转换」的类型。A2 上
self/vec2都不能是 BF16(实测 161002),而 promot 结果也不可能是 BF16(fp16+fp16=fp16、fp32+fp32=fp32,没有产生 bf16 的组合),因此
CanCast(任意promote, BF16)虽然放行,但 BF16 作为 out 值在语义上永远「推不出来」。列表却把它写成可选项之一。
实测取证
设备:Atlas A2(Ascend910B3)/ CANN 9.2.0 /
cann/ops-math@9a37afeb6。A.
out全 11 项按「输入侧同族 dtype 配合」扫描 —— 全部可跑(证明列表本身没错)B. BF16 在三个位置:输入侧被拒(与设备注一致),out 侧被接受(与设备注不一致)
C. A2 平台对 bf16 本身是支持的(排除「平台无能」):同机
torch.neg / exp / mul / outer四个 bf16 路径全部正常,fp32->bf16cast 正常。所以 A2 上 Ger 拒 BF16是算子能力边界,不是硬件边界,更说明设备注(第 135 行)的适用范围写得不够准。
建议改法
BFLOAT16改成按平台分列,或移到设备注里写明「仅 950PR/950DT 支持」;并说明 out 侧实际不拦(或修实现拦上,二者取一);
out行使用说明补一句「BFLOAT16 仅在 self/vec2 可取 BF16 的平台上有意义」。为什么不是实现 bug
out=BF16被接受并不产生错误结果:本次实测bf16 0x4040 = 3.0000,与 fp32 真值逐位一致。且 A2 的 legacy 实现
ops_legacy/ger.py在 docstring 里就写明only support float16, float32(第 70/72 行),接口层又已把 bf16 输入拦住,所以真正缺的是资料把设备注的适用范围与 out 列的死条目说清楚,不是去补一道 out 白名单。