eric2013 发表于 2019-10-29 12:58:11

【性能测评】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函数,后面有精力做一个全面的三角函数比较。









eric2013 发表于 2019-10-29 13:35:54

整理完毕。

fyyxxm 发表于 2019-10-29 13:46:29

H7的与G4的测试比较一下

rayan2019 发表于 2019-10-29 14:04:04

把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float

morning_enr6U 发表于 2019-10-29 14:49:27

:loveliness: 牛

eric2013 发表于 2019-10-29 15:06:58

fyyxxm 发表于 2019-10-29 13:46
H7的与G4的测试比较一下

回头买个G4板子测试下

eric2013 发表于 2019-10-29 15:07:21

rayan2019 发表于 2019-10-29 14:04
把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float

好的,晚上试试

eric2013 发表于 2019-10-29 15:46:01

rayan2019 发表于 2019-10-29 14:04
把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float

果然,sinf比sin要快不少,70个时钟周期左右,只比DSP库差10几个时钟周期。

rayan2019 发表于 2019-10-30 08:23:32

这个文档详细介绍了三角函数的效率对比,包含G4

eric2013 发表于 2019-10-30 13:22:43

rayan2019 发表于 2019-10-30 08:23
这个文档详细介绍了三角函数的效率对比,包含G4

相比H7,G4的硬件三角函数没看出优势。

anvy178 发表于 2020-1-14 14:19:40

eric2013 发表于 2019-10-30 13:22
相比H7,G4的硬件三角函数没看出优势。

版主 你好
使用V6 开发板使用最新的HAL库1.242   AC6编译器就跑一个闪灯的程序 ,下载进去居然不运行,这个时候的编译器级别是O0,但是使用调试器全速运行的话,它可以运行,奇怪。。。。。
,然后我把编译器优化级别改成OzImagesize,反而可以正常运行了(不用调试器的情况下)。
是啥子问题呀

wujialing3000 发表于 2020-1-14 17:29:39

之前我同一个项目程序,使用mdk,iar,ES进行编译运行。里面比较多的三角函数计算。我这边最后发现还是IAR的性能高一些。

carvenl 发表于 2022-8-22 09:42:26

rayan2019 发表于 2019-10-30 08:23
这个文档详细介绍了三角函数的效率对比,包含G4

浮点float32_t竟然比定点q31快了近一倍

snakeemail 发表于 2023-1-1 18:51:44

rayan2019 发表于 2019-10-29 14:04
把sin换成sinf其实差不多。sin 返回的是double,sinf返回的才是float

谢谢,还有sinf函数

sz-afa 发表于 2024-1-31 11:43:45

使用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);

}

eric2013 发表于 2024-1-31 11:48:32

sz-afa 发表于 2024-1-31 11:43
使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了, ...

谢谢分享。
页: [1]
查看完整版本: 【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能(2022-06-04更新)