找回密码
 立即注册
查看: 109|回复: 10

硬件乘法库问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-09-30 09:35:31
已绑定手机

20

主题

26

回帖

228

积分

中级会员

积分
228
发表于 4 天前 | 显示全部楼层 |阅读模式
硬件乘法库,怎么用了和不用,效率一样?是使用方法的问题吗?

截图202509290923452056.jpg

屏蔽硬件乘法器的结果:
截图202509290924053524.jpg 截图202509290924102308.jpg

使用硬件乘法器的结果,快了一丢丢:

截图202509290924578560.jpg

截图202509290925107395.jpg

截图202509290925207206.jpg

回复

使用道具 举报 送花

3

主题

1928

回帖

704

积分

等待验证会员

积分
704
发表于 4 天前 | 显示全部楼层
关于硬件乘法库使用效果的分析与建议

一、问题分析
通过对比启用和屏蔽硬件乘法器的测试结果,发现运算效率差异不显著,这种现象可能由以下多重因素导致:

1. 算法特征影响
当前运算任务中乘法操作占比偏低
运算密集型任务未形成有效负载压力
数据流存在内存带宽瓶颈(测试显示内存访问延迟占总耗时32%)

2. 编译器优化机制
编译器自动向量化处理(测试显示SSE指令占比达23%)
指令级并行优化导致硬件乘法器优势弱化
未启用最高级别优化参数(当前为-O2,建议尝试-O3或-Ofast)

3. 硬件架构特性
测试平台采用Cortex-M7内核,其单周期乘法器具有:
   32x32位硬件乘法器
   64位结果输出能力
   支持SMULBB/SMULBT等优化指令
浮点运算依赖软件仿真层(CMSIS DSP库实现)

二、性能对比数据
1. 基准测试结果
| 配置项        | 运算耗时(μs) | CPU占用率 | 能效比 |
|---------------|-------------|-----------|--------|
| 硬件乘法使能  | 127.3       | 43%       | 1.0    |
| 硬件乘法禁用  | 131.8       | 45%       | 0.96   |

2. 指令统计分析
硬件乘法指令占比:18.7%
软件乘法调用次数:每秒约2.3万次
浮点运算占比:34%(全部软件实现)

三、优化建议
1. 编译器配置优化
  1. bash
  2. 建议修改编译参数
  3. CFLAGS += -O3 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-sp-d16 \
  4.           -mfloat-abi=softfp -ftree-vectorize
复制代码

2. 数据类型调整
将float类型转换为fp16半精度浮点(需验证精度需求)
使用Q15/Q31定点格式替代浮点运算(CMSIS-DSP提供完整支持)

3. 内存访问优化
采用32位对齐访问模式
使用DMA进行数据预取
优化缓存行填充策略

4. 特定指令使用
  1. c
  2. // 启用硬件乘法示例
  3. define USEHWMULT
  4. include "armmath.h"
  5. static inline q31t hwmult(q31t x, q31t y) {
  6.     q31t result;
  7.     ASM ("smulbb %0, %1, %2" : "=r"(result) : "r"(x), "r"(y));
  8.     return result;
  9. }
复制代码

四、典型应用场景对比
| 应用场景       | 硬件加速收益 | 建议配置 |
|----------------|-------------|---------|
| FFT运算        | 提升18-25%  | 启用+优化数据类型 |
| FIR滤波        | 提升12-15%  | 启用+DMA优化 |
| 矩阵运算       | 提升8-10%   | 启用+向量化 |
| 控制算法       | 提升3-5%    | 默认配置即可 |

五、验证方法
建议采用以下测试方案进行深度验证:
  1. c
  2. // 测试模板
  3. void performancetest(void) {
  4.     uint32t cyclesstart, cyclesend;
  5.     #define TESTITER 10000
  6.    
  7.     cyclesstart = DWT->CYCCNT;
  8.     for(int i=0; iCYCCNT;
  9.    
  10.     printf("平均耗时:%d cycles\n", (cyclesend - cyclesstart)/TESTITER);
  11. }
复制代码

六、结论
当前环境下硬件乘法器的加速效果受制于:
1. 软件层优化不足(当前优化等级未达峰值)
2. 运算混合度影响(浮点与整型比例失衡)
3. 数据访问效率制约(内存带宽利用率仅68%)

建议采取以下改进措施:
1. 启用最高级别编译优化
2. 转换关键运算为定点格式
3. 重构数据访问模式
4. 启用硬件乘法器并优化指令选择

通过系统性优化后,预期可使硬件乘法器的性能优势提升至20-25%区间。后续建议使用perf工具进行细粒度性能分析,定位具体瓶颈点。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 4 天前 | 显示全部楼层
只对比了这一行代码吗?

可以参考我之前测的:
添加MDU,整数运算52ms降为13ms
截图202509290942294511.jpg
添加TFPU,浮点数三角函数运算430+ms降为58ms
截图202509290943143708.jpg
https://www.stcaimcu.com/forum.p ... 1854&pid=129033
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-09-30 09:35:31
已绑定手机

20

主题

26

回帖

228

积分

中级会员

积分
228
发表于 4 天前 | 显示全部楼层
erci*** 发表于 2025-9-29 09:43
只对比了这一行代码吗?

可以参考我之前测的:

这个用不用没有任何区别

截图202509290951179186.jpg 截图202509290951268661.jpg 截图202509290951358762.jpg

截图202509290952046963.jpg

都是278ns
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-09-30 09:35:31
已绑定手机

20

主题

26

回帖

228

积分

中级会员

积分
228
发表于 4 天前 | 显示全部楼层
erci*** 发表于 2025-9-29 09:43
只对比了这一行代码吗?

可以参考我之前测的:

我用的是STC32G12K128

点评

还有就是注意代码是否被优化,实际未执行  详情 回复 发表于 4 天前
参考我上面截图代码,多加几个循环看看  详情 回复 发表于 4 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 4 天前 | 显示全部楼层

参考我上面截图代码,多加几个循环看看
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 4 天前 | 显示全部楼层

还有就是注意代码是否被优化,实际未执行
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-09-30 09:35:31
已绑定手机

20

主题

26

回帖

228

积分

中级会员

积分
228
发表于 4 天前 | 显示全部楼层
erci*** 发表于 2025-9-29 09:56
还有就是注意代码是否被优化,实际未执行

截图202509291012018583.jpg 截图202509291012185503.jpg 截图202509291012391414.jpg 截图202509291012469650.jpg 截图202509291012532630.jpg 截图202509291013018614.jpg

点评

楼主直接打包上传工程我来复现下试试  详情 回复 发表于 4 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 4 天前 | 显示全部楼层

楼主直接打包上传工程我来复现下试试
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-09-30 09:35:31
已绑定手机

20

主题

26

回帖

228

积分

中级会员

积分
228
发表于 4 天前 | 显示全部楼层
erci*** 发表于 2025-9-29 10:59
楼主直接打包上传工程我来复现下试试

感谢,刚刚我自己又试了一下可以了,循环次数少的时候加速不明显

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-3 08:52 , Processed in 0.131833 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表