已关闭
[Bug-Report|缺陷反馈]: expint算子在 Ascend950(arch35)上对部分输入输出结果异常,表现为出现 inf`/NaN或精度明显偏差问题 #2383
kangjiaming创建于 7月27日关闭于 8月3日
陈思
7月28日 评论:
7月28日 评论:
/assign @kangjiaming


7月28日 将 kangjiaming 设为负责人
8月3日 关闭了 issue
8月3日 添加了label:resolved
/assign @kangjiaming


Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
一、问题描述 (必填)
expint(指数积分 Ei(x))算子在 Ascend950(arch35)上对部分输入输出结果异常,表现为出现inf/NaN或精度明显偏差。根因有以下几个方面:大输入
x时exp(x)浮点上溢Compute中调用Exp(tmp2, xFp32, n)计算 e^x,当x > 88时exp(x)超过 FP32 最大值(exp(89) > FLT_MAX),结果变为inf,进而污染后续e^x/x、乘法等运算,最终输出inf/NaN。原实现未对x做上界钳位。FP16/BF16 输出 Cast 溢出
ProcessFp16Bf16中将 FP32 计算结果直接Cast到 FP16/BF16。当 FP32 结果超过目标 dtype 表示范围(FP16 上限 65504.0,BF16 上限约 3.39e38)时,Cast 产出inf,导致输出错误。原实现未在 Cast 前对 FP32 结果做范围钳位。resultBuf在 Ascend950 上异常Compute原使用resultBuf作为结果缓冲,在 Ascend950 上存在异常(数据错误),需改用yLocal作为结果缓冲。近零阈值过严导致小值精度损失
ApplyBoundaries中原使用NEAR_ZERO_THRESHOLD = 1e-10f配合Abs(x) <= 1e-10判定零点并置结果为-inf。该阈值过严,会把1e-9等合法小值误判为零,导致这些点结果错误地变成-inf。应改为精确判等x == 0.0f。对齐填充区未初始化导致 NaN 污染
CopyIn中DataCopy仅搬运currentNum个有效元素,但 UB 对齐到CMP_ALIGN(64) 后尾部填充区为未初始化内存,参与向量运算后会引入NaN/随机值,污染有效结果。需在DataCopy前用合法值(如 1.0f)填充整个对齐区间。算子注册符号可见性缺失
IMPL_OP_OPTILING(Expint)注册缺少__attribute__((visibility("default"))),可能导致动态链接时符号不可见。二、环境信息 (可选)
math/expintop_kernel/expint_kernel.h、op_host/arch35/expint_tiling_arch35.cpp三、重现步骤 (可选)
expint,输入包含x > 88的大值(如 90、100),观察输出是否为inf/NaN。expint,输入使结果超过 65504 的较大x,观察 Cast 后输出是否溢出为inf。x取较小但大于 1e-10 的值(如 1e-9、1e-8),观察结果是否被错误置为-inf。NaN污染有效结果。四、预期结果 (可选)
x(x > 88)时,expint应对x钳位至 88.0 后计算,输出有限值而非inf/NaN。inf。x为合法小值(如 1e-9)时应正常计算,仅x == 0精确判定时置为-inf。NaN污染。Compute应使用yLocal作为结果缓冲,规避resultBuf在 Ascend950 上的异常。💡 备注(选填)
对应修复 PR:https://gitcode.com/cann/ops-math/pull/4165 (
fix expint bug)。修复要点:引入EXP_CLAMP=88.0f钳位 x;CopyIn中以 1.0f 预填充对齐区;ApplyBoundaries改为x==0.0f精确判等;Compute改用yLocal并内联各区间 Select 合并逻辑;ProcessFp16Bf16在 Cast 前按目标 dtype 上限钳位;BUFFER_NUM_FP32由 8 调整为 9(新增initBuf);注册补visibility("default")。