春去冬来月如风 发表于 2025-9-29 09:25:44

硬件乘法库问题

硬件乘法库,怎么用了和不用,效率一样?是使用方法的问题吗?



屏蔽硬件乘法器的结果:


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







国芯人工智能 发表于 2025-9-29 09:28:00

关于硬件乘法库使用效果的分析与建议

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

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. 编译器配置优化
bash
建议修改编译参数
CFLAGS += -O3 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-sp-d16 \
          -mfloat-abi=softfp -ftree-vectorize

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

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

4. 特定指令使用
c
// 启用硬件乘法示例
define USEHWMULT
include "armmath.h"

static inline q31t hwmult(q31t x, q31t y) {
    q31t result;
    ASM ("smulbb %0, %1, %2" : "=r"(result) : "r"(x), "r"(y));
    return result;
}

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

五、验证方法
建议采用以下测试方案进行深度验证:
c
// 测试模板
void performancetest(void) {
    uint32t cyclesstart, cyclesend;
    #define TESTITER 10000
   
    cyclesstart = DWT->CYCCNT;
    for(int i=0; iCYCCNT;
   
    printf("平均耗时:%d cycles\n", (cyclesend - cyclesstart)/TESTITER);
}

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

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

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

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

ercircle 发表于 2025-9-29 09:43:17

只对比了这一行代码吗?

可以参考我之前测的:
添加MDU,整数运算52ms降为13ms

添加TFPU,浮点数三角函数运算430+ms降为58ms

https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=11854&pid=129033

春去冬来月如风 发表于 2025-9-29 09:52:22

ercircle 发表于 2025-9-29 09:43
只对比了这一行代码吗?

可以参考我之前测的:


这个用不用没有任何区别





都是278ns

春去冬来月如风 发表于 2025-9-29 09:54:34

ercircle 发表于 2025-9-29 09:43
只对比了这一行代码吗?

可以参考我之前测的:


我用的是STC32G12K128

ercircle 发表于 2025-9-29 09:55:29

春去冬来月如风 发表于 2025-9-29 09:54
我用的是STC32G12K128

参考我上面截图代码,多加几个循环看看

ercircle 发表于 2025-9-29 09:56:08

春去冬来月如风 发表于 2025-9-29 09:54
我用的是STC32G12K128

还有就是注意代码是否被优化,实际未执行

春去冬来月如风 发表于 2025-9-29 10:13:10

ercircle 发表于 2025-9-29 09:56
还有就是注意代码是否被优化,实际未执行


ercircle 发表于 2025-9-29 10:59:45

春去冬来月如风 发表于 2025-9-29 10:13


楼主直接打包上传工程我来复现下试试

春去冬来月如风 发表于 2025-9-29 13:12:03

ercircle 发表于 2025-9-29 10:59
楼主直接打包上传工程我来复现下试试

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

页: [1] 2
查看完整版本: 硬件乘法库问题