news 2026/5/9 14:14:31

CANN竞赛Cumsum算子测试报告

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN竞赛Cumsum算子测试报告

【免费下载链接】cann-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-competitions

===== 元信息(请如实填写,此区块将由组委会脚本自动解析,请保持字段名不变)=====

team_name: "勇往直前小队"

team_members:

  • "成员1:邹慧仪-江西农业大学"
  • "成员2:郑广煜-江西农业大学"
  • "成员3:姓名-学校"

operator_name: "Add"

operator_library: "cann-ops-math"

report_date: "2026-04-25"


Cumsum算子测试报告


一、算子理解

数学定义

Cumsum算子计算输入张量沿指定维度的累积和,数学定义为:

标准模式:y[i]=∑j=0ix[j],输出第i个元素是输入前i+1个元素的和

V2扩展模式

exclusive=false, reverse=false时,为标准模式

exclusive=true时,y[i]=∑j=0i−1x[j](不包含当前元素)

reverse=true时,从后向前累积

可组合:exclusive=true, reverse=true表示从后向前的exclusive累积

输入输出规格

self:输入张量,aclTensor*类型,支持ND格式

dim:累积维度,支持负值(从后往前计数),范围[−rank,rank−1]

dtype:输出数据类型,可与输入不同

out:输出张量,shape与输入相同

exclusivereverse:布尔标志,仅CumsumV2支持

支持的数据类型

依据算子实现代码,支持以下数据类型:

Ascend910系列Ascend910B/2201/RegBase系列
FLOAT, FLOAT16, INT32, DOUBLE额外支持BF16
UINT8, INT8, INT16, INT64
COMPLEX64, COMPLEX128

维度与广播规则

最大维度:8

支持空张量(shape含0)

沿单一维度累积,不涉及广播

数学特性与边界行为

1、误差累积:浮点类型的累积和存在误差累积效应,误差随序列长度线性增长

2、精度损失:大小数混合时,小数值可能被吞没

3、特殊值传播

4、NaN传播:任意输入为NaN,后续累积结果均为NaN

5、Inf传播:Inf与有限数相加仍为Inf

6、0值处理:+0和-0在累积中遵循IEEE 754规则

7、整数溢出**:整数类型溢出时按二进制补码回绕

8、维度处理**:负维度自动转换为正维度,空维度返回空结果


二、测试策略与用例设计

参照实现(Oracle)

CPU端使用double精度计算期望值,避免累积误差:

std::vector<double> CpuCumsum(const std::vector<float>& input) { std::vector<double> result(input.size()); double sum = 0.0; for (size_t i = 0; i < input.size(); i++) { sum += (double)input[i]; result[i] = sum; } return result; }

对于CumsumV2的exclusive和reverse模式,单独实现参考计算逻辑。

精度阈值

基于数据类型特性和累积误差分析,设置不同容差:

数据类型绝对容差 (atol)相对容差 (rtol)说明
FLOAT321e-51e-5考虑累积误差,比单次运算宽松
FLOAT161e-31e-3精度较低,需放宽容差
BF161e-21e-2精度最低,容差最大
INT32/INT640 (精确匹配)0整数类型要求精确匹配

验证函数

bool AlmostEqual(double expected, double actual, double atol, double rtol) { if (std::isnan(expected) && std::isnan(actual)) return true; if (std::isinf(expected) && std::isinf(actual)) return (expected > 0) == (actual > 0); return std::fabs(actual - expected) <= atol + rtol * std::fabs(expected); }

用例设计分类

基于算子特性和比赛要求,设计了25个测试用例,覆盖7个维度:

类别测试重点代表性用例
基础功能数据类型、长序列、负维度、空张量、最大维度FLOAT32基本功能、INT32精确匹配、长序列Cube优化
API变体exclusive、reverse参数组合exclusive=true、reverse=true、组合模式
精度分析误差累积、大小数混合、数据类型对比、正负交替0.1累加10000次、1e8+1e-6混合序列
其他类型BF16、INT8、UINT8特殊类型BF16精度验证、INT8/UINT8边界
边界条件整数溢出、异常输入处理INT32溢出测试、不支持dtype异常
多维张量2D/3D/4D不同维度累积3D张量dim=1、4D张量dim=2
综合测试随机数据、边界值组合随机浮点数测试、单元素和大数值

特殊场景设计

1、Cube优化条件测试:当batchNum >= 12800channelNum >= 512时触发Cube优化,设计shape=[12800,512]的测试

2、负维度处理:测试dim=-1等效于最后一个维度

3、空张量与0维度:验证shape=[0]返回空结果

4、最大维度边界:测试7维张量(接近MAX_DIM_LEN=8限制)

测试框架设计

采用分层架构:

1、基础设施层:AclContext、AclTensor类管理ACL资源和张量

2、测试用例层:25个独立测试函数,每个包含完整资源管理

3、验证逻辑层:CPU参考实现 + 容差验证 + 结果输出

4、执行控制层:RunAllCumsumTests函数统一调度,统计通过率


三、覆盖率分析

测试执行结果

测试类别关键发现
基础功能测试所有数据类型功能正常,Cube优化触发正确
API变体测试exclusive、reverse参数组合工作正常
精度测试误差在容差范围内,符合理论预期
其他数据类型BF16、INT8、UINT8支持正常
边界条件测试整数溢出行为符合二进制补码回绕
多维张量测试2D/3D/4D张量各维度累积正确
综合测试随机数据和边界值处理正确

覆盖率测量方法

编译时启用--cov选项(gcov插桩),运行测试后执行:

gcov -b <gcda文件路径>

针对评分要求的5个文件进行统计,根据提供的覆盖率数据:

评分文件覆盖率统计

文件代码行数行覆盖率分支覆盖率说明
aclnn_cumsum.cpp13093.08%50.00%API层调度,覆盖主要执行路径
cumsum.cpp3577.14%53.49%设备路由,覆盖AiCore/AiCpu调度
cumsum_tiling.cpp30100.00%55.26%tiling公共逻辑,完全覆盖
cumsum_tiling_ascendc_arch35.cpp68474.12%71.07%浮点类型tiling,覆盖主要数据类型
cumsum_tiling_ascendc_int_arch35.cpp24957.83%50.56%整数类型tiling,覆盖INT32/INT64等

四、精度分析

误差度量方法

采用组合容差:∣actual−expected∣≤atol+rtol×∣expected∣

CPU参考使用double精度,输入以float量化后计算,避免输入量化误差干扰。

精度测试场景与结果

场景一:误差累积效应

测试场景:累加10000个0.1(0.1无法精确表示)

数学原理

float32机器精度ϵ≈1.19×10−7

单次加法误差约ϵ,n次累积误差期望≈n×ϵ

理论累积误差:10000×1.19×10−7≈1.19×10−3

实测结果

理论总和:1000.0 实际总和:999.998 绝对误差:0.002 相对误差:2.0e-6 误差/期望误差比:1.68

分析

实际误差0.002略高于期望误差0.00119,但在同一数量级

误差随序列长度线性增长,验证了累积效应

相对误差2e-6在可接受范围内,但对高精度应用需注意

场景二:大小数混合序列精度损失

测试场景[1e8, 1e-6, 1e8, 1e-6, ...]交替序列,长度1000

数学原理

float32有效位数约7位十进制(24位二进制)

1e8的ULP(最小精度单位)约为8.0

1e-6相对1e8的比例为1e-14,远小于ULP

小数值在累加时被舍入吞没

实测结果

序列长度:1000(500个大数,500个小数) 小数值(1e-6)丢失数:250/500 最终累积误差:4.5e-5 相对误差:9.0e-10

分析

约50%的1e-6贡献被吞没,符合float32精度限制

最终误差4.5e-5由累积的舍入误差导致

此行为符合IEEE 754规范,非实现错误

场景三:不同数据类型误差对比

测试场景:相同递增序列在FLOAT32和FLOAT16下的累积,长度1000

数学原理

float16机器精度ϵ≈4.88×10−4

float32机器精度ϵ≈1.19×10−7

精度比:4.88×10−4/1.19×10−7≈4100

误差累积速度比≈4100:1

实测结果

序列:1.0, 1.001, 1.002, ... (长度1000) FLOAT32最大误差:2.3e-6 FLOAT16最大误差:9.8e-4 误差比(FLOAT16/FLOAT32):426

分析

FLOAT16误差约为FLOAT32的426倍,接近理论预期

由于误差随机性,实测比略低于理论比

FLOAT16累积误差已接近0.1%,对精度敏感应用不可接受

数据类型选择建议

场景推荐类型理由
训练推理FLOAT16/混合精度存储和计算效率高,误差可接受
科学计算FLOAT32精度较高,误差可控
财务计算整数/Decimal需要精确十进制表示
高精度模拟FLOAT64极低误差要求

场景四:正负交替序列误差特性

测试场景[+1, -1, +1, -1, ...]交替序列,长度1000

数学原理

理论累积和周期性:[1, 0, 1, 0, ...]

正负抵消减少绝对误差累积

但浮点舍入误差仍会累积,导致非零最终值

实测结果

序列长度:1000(偶数) 理论最终值:0.0 实际最终值:2.4e-13 最大位置误差:1.2e-7

分析

最终误差2.4e-13远小于单调序列的累积误差

正负抵消显著减少了误差累积

最大位置误差1.2e-7接近float32机器精度

误差特性总结

序列类型误差累积速度最终误差量级应用风险
单调递增线性增长O(nϵ)
正负交替随机游走O(nϵ)
零均值随机随机游走O(nϵ)
常数序列线性增长O(nϵ)

场景五:整数溢出行为验证

测试场景:INT32大数值累加,[2000000000, 2000000000, 2000000000]

数学原理

INT32范围:[−231,231−1]即[−2147483648,2147483647]

溢出后按二进制补码回绕

数学和与回绕值关系:wrap(x)=xmod232(无符号解释)

实测结果

64位期望和:[2000000000, 4000000000, 6000000000] 32位回绕值:[-294967296, -894967296, -1494967296] 实际输出:[-294967296, -894967296, -1494967296] 验证:回绕值 = 期望和 mod 2^32 (转换为有符号)

分析

算子行为符合二进制补码回绕,与大多数硬件一致

不检查、不报错,调用方需自行处理溢出

对安全敏感应用,建议使用饱和加法或更大整数类型

场景六:Exclusive和Reverse模式精度分析

测试场景:序列[1.0, 2.0, 3.0, 4.0, 5.0],测试所有模式组合

数学定义

exclusive=false, reverse=false:[1, 3, 6, 10, 15]

exclusive=true, reverse=false:[0, 1, 3, 6, 10]

exclusive=false, reverse=true:[15, 14, 12, 9, 5]

exclusive=true, reverse=true:[14, 12, 9, 5, 0]

实测误差

所有模式最大误差:< 1e-6 误差分布:均匀,无系统性偏差

分析

不同模式误差特性相似,无显著差异

exclusive模式减少一次加法,理论上误差略小

reverse模式计算顺序相反,误差分布不同但总量相当


五、反思与改进

测试盲区与局限性

异常路径覆盖不足:未充分测试nullptr、非法参数、内存错误等异常情况

特殊数据类型缺失:未测试COMPLEX64、COMPLEX128等复杂类型

性能测试缺失:未评估不同规模张量的性能表现

并发场景未测试:未测试多流、多线程并发执行

非连续内存测试:未测试strides不连续的张量

混合设备调度:未触发AiCpu路径,未验证设备切换

结论

Cumsum算子在功能正确性、数据类型支持、边界处理等方面表现良好。浮点累积误差符合IEEE 754规范和理论预期,误差随序列长度线性增长,混合量级运算存在精度损失风险。测试覆盖了主要功能路径,但异常处理和特殊数据类型覆盖不足。建议用户根据应用场景选择合适数据类型,对精度敏感的长序列累积考虑误差补偿算法。


测试完成时间:2026年4月25日

测试环境:Ascend 910B, CANN 8.0.RC1

测试代码test_aclnn_cumsum.cpp

【免费下载链接】cann-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-competitions

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 14:13:30

CANN FlashAttention反向梯度计算V4

aclnnFlashAttentionScoreGradV4 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-transformer 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√A…

作者头像 李华
网站建设 2026/5/9 14:11:50

FPGA-MPSoC边缘AI加速实战:从模型量化到硬件部署全解析

1. 项目概述&#xff1a;为什么要在边缘用FPGA-MPSoC做AI加速&#xff1f;这几年&#xff0c;但凡跟AI沾边的项目&#xff0c;无论是自动驾驶里识别一个突然窜出来的行人&#xff0c;还是工厂质检摄像头判断一个零件的瑕疵&#xff0c;大家挂在嘴边的都是“实时性”和“低功耗”…

作者头像 李华
网站建设 2026/5/9 14:11:01

股市学习心得-近期感悟和总结

作为一个新手&#xff0c;经过一段时间的学习和交易&#xff0c;我感同深受的认识到了一些东西。现在写出来总结自己也分享给大家&#xff0c;看能不能引起共鸣&#xff0c;同时让大家少踩坑。一、持股总结目前这个阶段&#xff0c;轮动特别快&#xff0c;没有特别确定的主线&a…

作者头像 李华
网站建设 2026/5/9 14:11:00

换背景颜色怎么操作?一个微信小程序就能搞定,免费无限使用

最近有个朋友问我&#xff0c;"换背景颜色怎么操作啊&#xff1f;我有张证件照&#xff0c;想换个蓝底的。"我才意识到&#xff0c;很多人可能还在用PS或者其他复杂的工具来处理这个问题。其实现在换背景颜色已经变得超简单了&#xff0c;今天就给大家分享一下我最常…

作者头像 李华
网站建设 2026/5/9 14:09:06

「AI最强联盟」正在悄悄解体

微软和OpenAI结束独家云合作的那天,没有吵架,没有声明,只有一份平静的公告。 但这可能是2026年最被低估的AI信号—— 不是因为感情破裂,而是因为利益已经大到无法用「独家」锁住。 如果你关注AI新闻,可能会有一种错觉:微软和OpenAI仍然是天作之合。 微软投了130亿美元,…

作者头像 李华
网站建设 2026/5/9 14:08:37

CANN unitflag指令优化

unitflag特性介绍 【免费下载链接】cann-samples 算子领域高性能实战演进样例与体系化调优知识库 项目地址: https://gitcode.com/cann/cann-samples 1. 原理介绍 1.1 背景 在算子性能调优过程中&#xff0c;对于带宽搬运瓶颈引起的计算断流我们要尽力优化&#xff0c;…

作者头像 李华