硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9145|回复: 15
收起左侧

[STM32H7] 【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能(2022-06-04更新)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-10-29 12:58:11 | 显示全部楼层 |阅读模式
测试条件:
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库实现方案。

提供一个STM32H7的例程供大家测评:
speed test.7z (5.1 MB, 下载次数: 402)
QQ截图20191029125246.jpg

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个时钟周期左右。


MDK5的AC5开启的优化等级:
QQ截图20191029130140.jpg

MDK5的AC6开启的优化等级:
QQ截图20191029130507.jpg

MDK使用微库和C库通过这个对勾切换:
4.jpg

IAR开启的优化等级
QQ截图20191029130616.jpg

Embedded Studio优化等级和C库选Fast模式
7.jpg
5.jpg


总结:
1、DSP库的三角函数计算在MDK,IAR和ES上的性能都差不多。
2、使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了,所以暂不加入比较。
3、当前仅测试一个sin函数,后面有精力做一个全面的三角函数比较。









评分

参与人数 1金币 +6 收起 理由
龙之谷 + 6 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-10-29 13:35:54 | 显示全部楼层
整理完毕。
回复

使用道具 举报

4

主题

160

回帖

172

积分

初级会员

积分
172
发表于 2019-10-29 13:46:29 | 显示全部楼层
H7的与G4的测试比较一下
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-10-29 14:04:04 | 显示全部楼层
把sin换成sinf  其实差不多。sin 返回的是double,sinf返回的才是float
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2019-10-29 14:49:27 | 显示全部楼层
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-10-29 15:06:58 | 显示全部楼层
fyyxxm 发表于 2019-10-29 13:46
H7的与G4的测试比较一下

回头买个G4板子测试下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-10-29 15:07:21 | 显示全部楼层
rayan2019 发表于 2019-10-29 14:04
把sin换成sinf  其实差不多。sin 返回的是double,sinf返回的才是float

好的,晚上试试
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-10-29 15:46:01 | 显示全部楼层
rayan2019 发表于 2019-10-29 14:04
把sin换成sinf  其实差不多。sin 返回的是double,sinf返回的才是float

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

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-10-30 08:23:32 | 显示全部楼层
这个文档详细介绍了三角函数的效率对比,包含G4
捕获01.JPG
捕获02.JPG

Getting started with the CORDIC accelerator using STM32CubeG4 MCU Package.pdf

405.67 KB, 下载次数: 57

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-10-30 13:22:43 | 显示全部楼层
rayan2019 发表于 2019-10-30 08:23
这个文档详细介绍了三角函数的效率对比,包含G4

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

使用道具 举报

15

主题

34

回帖

79

积分

初级会员

积分
79
发表于 2020-1-14 14:19:40 | 显示全部楼层
eric2013 发表于 2019-10-30 13:22
相比H7,G4的硬件三角函数没看出优势。

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

使用道具 举报

22

主题

250

回帖

321

积分

高级会员

积分
321
发表于 2020-1-14 17:29:39 | 显示全部楼层
之前我同一个项目程序,使用mdk,iar,ES进行编译运行。里面比较多的三角函数计算。我这边最后发现还是IAR的性能高一些。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2022-8-22 09:42:26 | 显示全部楼层
rayan2019 发表于 2019-10-30 08:23
这个文档详细介绍了三角函数的效率对比,包含G4

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

使用道具 举报

41

主题

214

回帖

337

积分

高级会员

积分
337
发表于 2023-1-1 18:51:44 | 显示全部楼层
rayan2019 发表于 2019-10-29 14:04
把sin换成sinf  其实差不多。sin 返回的是double,sinf返回的才是float

谢谢,还有sinf函数
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-1-31 11:43:45 | 显示全部楼层
使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了,所以暂不加入比较。   这个问题有个解决的办法。 就是dwt时钟初始化的代码在调试的时候不运行。
[C] 纯文本查看 复制代码
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);

}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-1-31 11:48:32 | 显示全部楼层
sz-afa 发表于 2024-1-31 11:43
使用MDK的AC6时,使用DWT是周期计数器无法正常测量C库做三角函数运算的执行时间,时间非常短,感觉异常了, ...

谢谢分享。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 22:50 , Processed in 0.503193 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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