一、赛题背景
【免费下载链接】cann-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-competitions
高斯误差函数 (erf) 是数学和统计学中的基本函数,广泛应用于概率论、统计学、物理学和工程学等领域。在深度学习中,erf函数常用于激活函数、归一化层等场景。
本题要求基于PyTorch原生算子的核心业务逻辑,采用Ascend C编程语言进行算子原生开发,在昇腾NPU硬件上实现一款高性能、高精度的erf算子。
二、算子功能描述
实现的erf算子需对输入张量执行高斯误差函数计算。算子计算公式为:y = erf(x)。
算子支持多种数据类型,输出类型与输入类型保持一致,需兼容非32整倍数的维度非对齐场景。
三、核心定义与约束
3.1 参考算子
PyTorch原生算子:torch.erf
参考文档:https://pytorch.org/docs/stable/special.html#torch.special.erf
3.2 输入输出与属性总览
| 类型 | 参数名 | 类型 | 维度形状 | 支持数据类型 | 数据格式 | 备注 |
|---|---|---|---|---|---|---|
| INPUT(必选) | x | tensor | 无限制 | float32 | ND | 输入张量 |
| OUTPUT(输出) | y | tensor | 无限制 | float32 | ND | 计算结果张量 |
3.3 关键输入约束
维度取值范围(均为正整数):
输入x:任意合法维度,支持多维张量
输出y:形状与输入x一致
非对齐场景兼容:算子需适配内存/数据非 32 字节对齐的场景
数值取值约束:输入张量的数值取值范围不超出对应数据类型的原生表达范围
数据类型约束:输入输出数据类型保持一致
3.4 数学公式与计算规则
- 基础公式:
$\operatorname{erf}(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x} e^{-t^2},dt$
- 计算步骤:
- 直接计算输入x的高斯误差函数值
- 关键实现:
erf误差函数计算逻辑复杂,可以有不同的近似计算方式,需要满足精度标准下在不同值域更优的算法; cann社区中预置erf计算公式如下:
$x=\min(x,3.92), \quad x=\max(x,-3.92)$
$\operatorname{erf}(x)= \frac{ \left(\left(\left((0.053443748819x^2+0.75517016694e1)x^2+0.10162808918e3\right)x^2+0.13938061484e4\right)x^2+0.50637915060e4\right)x^2+0.2963838468e5 }{ \left(\left(\left((x^2+0.31212858877e2)x^2+0.39856963806e3\right)x^2+0.30231248150e4\right)x^2+0.13243365831e5\right)x^2+0.2667224157e5 }x$
数值稳定性要求:需使用数值稳定的实现方式,避免中间计算溢出,特别是对于大输入值
精度要求:计算结果需满足以下精度误差要求:
float32:相对误差 < 1e-4,绝对误差 < 1e-4(双万分之一精度)
3.5 输出要求
形状约束:输出张量的形状与输入张量形状完全一致
类型约束:输出数据类型与输入数据类型保持一致
数值范围:输出值范围为[-1, 1],由于erf函数的值域为[-1, 1]
四、规则要求
数值稳定性:必须使用数值稳定的实现方式,避免中间计算溢出,特别是erf函数的近似计算
性能要求:在保证数值精度和正确性的前提下,优化计算性能,充分利用NPU硬件特性:
支持向量化计算
优化内存访问模式
合理利用NPU计算单元
五、示例说明
示例 1:基础计算
输入x:tensor ([0.0, 1.0, 2.0]),dtype=float32,shape=[3] 输出y:tensor ([0.0000, 0.8427, 0.9953]),dtype=float32,shape=[3]
结果解释:标准erf函数计算结果
示例 2:负值计算
输入x:tensor ([-1.0, -2.0, -3.0]),dtype=float32,shape=[3] 输出y:tensor ([-0.8427, -0.9953, -0.99998]),dtype=float32,shape=[3]
结果解释:erf函数是奇函数,erf(-x) = -erf(x)
示例 3:高维张量计算
输入x:tensor (shape=[2,3,4,5]),dtype=float32,随机数值范围[-3,3] 输出y:tensor (shape=[2,3,4,5]),dtype=float32
结果解释:高维张量逐元素计算,输出形状与输入一致
六、测试用例覆盖范围
数据类型覆盖:float32
维度场景覆盖:
基础维度:1维、2维、3维、4维
高维场景:含批次维度的多维场景
非对齐场景:非32整倍数的内存非对齐场景
数值范围覆盖:
正常数值范围:[-3, 3](erf函数主要变化区间)
饱和区间:[-10, -3]和[3, 10](erf函数接近±1的区间)
零值附近:[-0.1, 0.1](erf函数线性区间)
精度场景覆盖:
正常数值范围:常规计算验证
边界数值:接近±1的饱和区间精度验证
精度验证:验证双万分之一(float32)精度要求
【免费下载链接】cann-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-competitions
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考