基于CoreMark进行S32K144的性能测试

1.CoreMark介绍

1.1 CoreMark是什么

按照CoreMark官网的介绍,CoreMark是一个简单但设计精巧的基准测试,专门用于测试处理器内核的功能。运行CoreMark会产生一个单一数字的分数,使用户能够在处理器之间进行快速比较,得分越高的处理器,意味着其性能越强。

CoreMark的模拟工作负载主要包含几种常用的算法:

  • 矩阵操作,模拟常用的运算;
  • 链表操作,模拟指针的各种用法;
  • 状态机操作,模拟程序分支运行操作;
  • 循环冗余校验(CRC),嵌入式系统常见的功能。

1.2 CoreMark和Dhrystone的对比

CoreMark由嵌入式微处理器基准测试联盟(EEMBC)在2009年开发,目的是为了取代过时的Dhrystone标准。CoreMark和Dhrystone对比的情况如下:

1.2.1 相同点

与Dhrystone一样,CoreMark也具有如下特点:

  • 体积小
  • 便于移植
  • 易于理解
  • 免费
  • 显示单一数字的基准分数。
1.2.2 不同点

与Dhrystone不同的是,CoreMark有特定的运行和报告规则,其设计是为了避免Dhrystone中存在的以下问题:

  1. Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是MCU或CPU的能力。因此,Dhrystone作为编译器基准测试比作为硬件基准测试更能显示出它的价值。
  2. 在Dhrystone的计时部分(基准测试的核心部分),也会进行库调用。通常情况下,这些库调用占据了基准测试的大部分时间。由于库的代码不是基准的一部分,如果使用不同的库,就很难比较结果。
  3. 虽然存在关于如何运行Dhrystone的指南,但运行结果没有官方组织去认证或验证,所以没有强制执行。对于如何报告Dhrystone的结果,目前还没有统一的标准,有各种不同的格式(DMIPS、Dhrystones per second、DMIPS/MHz)。
  4. Dhrystone的C代码不兼容ANSI C。

2.CoreMark源码获取

目前CoreMark的源码托管在GitHub上,仓库地址为:https://github.com/eembc/coremark。
进入主页,主要的文件如下,其中红框的文件以及barebones文件夹是用于裸机的,clone仓库到本地之后,只需要复制这些文件就可以。

这些文件的作用如下:

  • barebones 裸机平台移植需要使用的文件夹
    • core_portme.c 平台移植文件,需要实现对应MCU的初始化配置以及计时功能等
    • core_portme.h 平台移植配置,主要配置计时部分
    • ee_printf.c 裸机打印输出文件,需要实现串口发送功能等
    • cvt.c 实现格式化输出需要调用的部分底层函数
  • core_list_join.c 包含链表测试函数的文件
  • core_main.c CoreMark主函数文件
  • core_matrix.c 包含矩阵计算测试函数的文件
  • core_state.c 包含状态机测试函数的文件
  • core_util.c 包含CRC校验测试函数的文件
  • coremark.h CoreMark头文件

3.CoreMark移植

为了快速了解并移植CoreMark,笔者选了比较熟悉的S32K144。主要的移植工作有如下几方面:

  • MCU初始化配置,包含时钟,引脚,串口,定时器等
  • 实现串口打印输出
  • 实现计时相关函数
  • 修改平台相关宏定义

3.1 准备工作

需要准备的东西如下:

  • S32K144EVB-Q100
  • S32DS For ARM 2.2
  • pc端的串口调试助手

3.2 开始移植

3.2.1 S32K144基础配置
  1. 打开S32DS For ARM 2.2,选择新建应用工程,如下所示:
  2. 选择S32K144,工程名称为S32K144_CoreMark,其他选项配置如下,点击完成。
  3. 将CoreMark相关文件添加进工程树,同时增加lpit组件和lpuart组件,并添加下barebones文件夹路径,如下图:
  4. 打开clock组件,配置系统(内核)时钟为80MHz,lpit和lpuart时钟为4MHz,如下图所示:
  5. 配置lpit组件,计时周期为100s如下所示:

CoreMark的主函数运行时间一般是几十秒左右,将计时周期设为100s,是希望整个主函数运行期间不进入中断,提供计时的准确性。

  1. 配置lpuart组件,波特率设为115200,如下所示:
3.2.2 CoreMark部分代码配置
  1. core_portme.c中的portable_init函数中添加MCU初始化代码,如下所示:
  2. 实现core_portme.c中的barebones_clock函数,增加定时器中断函数,并修改时钟频率,如下所示:
  3. 实现ee_printf.c中uart_send_char函数功能,如下所示:
  4. 修改core_portme.c中的宏定义,如下所示:

迭代次数不能设置的过小,要保证需要进行矩阵计算等测试的函数运行时间超过10s,否则打印信息会提示检测到错误。

  1. 最后修改core_main.c中main函数名称为core_main,并在主函数中进行调用,如下所示:
  2. 将该工程的优化等级设置为-O3,如下所示:

    至此,移植工作已经完成,由于在CoreMark调用了不少SDK中的函数,在实际移植时,需要包含对应的头文件。

4.S32K144的CoreMark得分

4.1 CoreMark测试情况

将工程编译下载至S32K144EVB-Q100,上电运行之后,打印的信息如下,CoreMark得分为140:

4.2 不同优化等级下的CoreMark得分

实际测试的过程中,发现不同的优化等级,对CoreMark的得分影响还是挺大的。S32DS For ARM 2.2一共有四种优化等级,-O0,-O1,-O2,-O3,其中-O0是不进行优化,-O3是优化程度最深。四种优化等级的CoreMark得分情况如下:

4.3 其他说明

网上很多的文章测试MCU的CoreMark得分都是使用IAR或者Keil,这两个IDE的编译器优化做的比较好,而S32DS For ARM 2.2使用的是开源的GCC,优化不如前者,所以测试出来的CoreMark数据仅供参考。
有兴趣的读者可以使用IAR或者Keil开发S32K144的CoreMark程序并测试,得到的跑分应该会更高。

ARM官方给的数据,Cortex-M4内核的CoreMark/MHz为3.40,那么80MHz的S32K144的CoreMark得分应该在272左右

5.程序分享

  • 链接:https://pan.baidu.com/s/1gyKWDNpMphykZRc8ZvlfnQ
  • 提取码:z05f

感谢您能阅读到这里,如果觉得有用,不妨给个一键三连吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auto FAE进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值