【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能(2022-06-04更新)
测试条件:1、IAR8.50开最高等级速度优化。
2、MDK5.30正式版使用AC5开最高等级优化3,开启时间优化,测试C标准库和微库MicroLib两种。
3、MDK5.30正式版使用AC6开最高等级的速度优化,测试C标准库和微库MicroLib两种。
4、Embedded Studio5.20版使用GCC开最高等级优化,开C库使用Fast模式。
5、Embedded Studio5.20版使用CLANG开最高等级优化,开C库使用Fast模式。
6、DSP库使用最新的CMSIS软件包里面的V5.6.0。
7、测试单位使用DWT时钟周期计数器。
8、DSP库使用函数arm_sin_f32测试,IAR,MDK和ES都使用各自带的C库测试。执行10次,求平均。
注意,IAR,MDK和ES都有各自的C库实现方案。
static/image/hrline/4.gif
提供一个STM32H7的例程供大家测评:
static/image/hrline/4.gif
1、MDK5 AC5 MicroLib
(1)DSP库函数第一次执行69个时钟周期,之后重复执行都是55个时钟周期左右。
(2)微库的sin函数84,之后重复执行是67个时钟周期左右。
2、MDK5 AC5 C Lib
(1)DSP库函数第一次执行71个时钟周期,之后重复执行都是55个时钟周期左右。
(2)C库的sinf函数94,之后重复执行是68个时钟周期左右。
3、MDK5 AC6 MicroLib
(1)DSP库函数第一次执行74个时钟周期,之后重复执行都是53个时钟周期左右。
(2)C库的sin函数,使用DWT时钟周期计数器无法正常测量。
4、MDK5 AC6 C Lib
(1)DSP库函数第一次执行71个时钟周期,之后重复执行都是52个时钟周期左右。
(2)C库的sin函数,使用DWT时钟周期计数器无法正常测量。
5、IAR
(1)DSP库函数第一次执行80个时钟周期,之后重复执行都是58个时钟周期左右。
(2)C库的sin函数93,之后重复执行是80个时钟周期左右。
6、Embedded Studio GCC
(1)DSP库函数第一次执行80个时钟周期,之后重复执行都是52个时钟周期左右。
(2)单精度和双精度执行时间差不多,C库的sin函数138/132,之后重复执行是129/115个时钟周期左右。
7、Embedded Studio CLANG
(1)DSP库函数第一次执行90个时钟周期,之后重复执行都是59个时钟周期左右。
(2)单精度和双精度执行时间差不多,C库的sin函数141/130,之后重复执行是129/115个时钟周期左右。
static/image/hrline/4.gif
MDK5的AC5开启的优化等级:
MDK5的AC6开启的优化等级:
MDK使用微库和C库通过这个对勾切换:
IAR开启的优化等级
Embedded Studio优化等级和C库选Fast模式
static/image/hrline/4.gif
总结:
1、DSP库的三角函数计算在MDK,IAR和ES上的性能都差不多。
2、使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了,所以暂不加入比较。
3、当前仅测试一个sin函数,后面有精力做一个全面的三角函数比较。
整理完毕。 H7的与G4的测试比较一下 把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float :loveliness: 牛 fyyxxm 发表于 2019-10-29 13:46
H7的与G4的测试比较一下
回头买个G4板子测试下 rayan2019 发表于 2019-10-29 14:04
把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float
好的,晚上试试 rayan2019 发表于 2019-10-29 14:04
把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float
果然,sinf比sin要快不少,70个时钟周期左右,只比DSP库差10几个时钟周期。
这个文档详细介绍了三角函数的效率对比,包含G4 rayan2019 发表于 2019-10-30 08:23
这个文档详细介绍了三角函数的效率对比,包含G4
相比H7,G4的硬件三角函数没看出优势。 eric2013 发表于 2019-10-30 13:22
相比H7,G4的硬件三角函数没看出优势。
版主 你好
使用V6 开发板使用最新的HAL库1.242 AC6编译器就跑一个闪灯的程序 ,下载进去居然不运行,这个时候的编译器级别是O0,但是使用调试器全速运行的话,它可以运行,奇怪。。。。。
,然后我把编译器优化级别改成OzImagesize,反而可以正常运行了(不用调试器的情况下)。
是啥子问题呀 之前我同一个项目程序,使用mdk,iar,ES进行编译运行。里面比较多的三角函数计算。我这边最后发现还是IAR的性能高一些。 rayan2019 发表于 2019-10-30 08:23
这个文档详细介绍了三角函数的效率对比,包含G4
浮点float32_t竟然比定点q31快了近一倍 rayan2019 发表于 2019-10-29 14:04
把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float
谢谢,还有sinf函数 使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了,所以暂不加入比较。 这个问题有个解决的办法。 就是dwt时钟初始化的代码在调试的时候不运行。void bsp_dwt_init(void)
{
if (DWT->CYCCNT != 0)
{
__IO uint32_t tmpCnt = 0;
__IO uint32_t tmpCCNT;
tmpCCNT = DWT->CYCCNT;
while (tmpCnt++ < 0xFFFF) __NOP(); // 延时一段时间
if (DWT->CYCCNT != tmpCCNT)
{// 数值变化了,说明是调试debug模式,debug模式调试器会打开DWT时钟。后面的打开dwt时钟操作不运行
return;
}
}
/* 禁用 TRACE */
//CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
/* 启动 TRACE */
CoreDebug->DEMCR |=CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;
DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
DWT->CYCCNT = 0U;
/* 启动时钟周期计数器 */
DWT->CTRL |=DWT_CTRL_CYCCNTENA_Msk; //0x00000001;
__NOP();
while (DWT->CYCCNT == 0);
} sz-afa 发表于 2024-1-31 11:43
使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了, ...
谢谢分享。
页:
[1]