本帖最后由 okwh 于 2016-12-19 20:08 编辑
心仪M7--STM32F769I-DISCO评测-CoreMark测试 (二)
本次我们介绍 处理器性能测试基准程序(CoreMark)。
历史渊源
大家知道,有众多厂家生成处理器,但这些的产品优劣如何如何货比三家呢?
成立于1997年的非盈利组织EEMBC, the Embedded Microprocessor Benchmark Consortium, 嵌入式微处理器基准协会, 设计了一些程序软件(测试基准benchmark)来进行比较和评价。简单的讲,这东西就是个货比三家的参考,谁让人类喜欢排名呢。EEMBC目前提供的测试包括用于云和大数据、手机和pad移动设备、网络通讯、低功耗控制器、Iot、数字声视媒体、汽车自动化等不同任务。通常流传较广的是用于通用测试的CoreMark、MultiBench (多核)、FPMark (浮点计算)。
其实至今,测试基准有很多,目前我们知道较多,上媒体较多就是CoreMark。由于计算机核心是用于计算的,主要测试其实就是测试其计算速度、计算能力的。之前常用的是上个世纪80年代的Dhrystone benchmark,用DMIPS/MHz(Dhrystone Million Instructions executed Per Second/MHz,每兆赫兹每秒百万指令)做计量单位,主要用整数计算、过程调用、间接指针、任务分配等测试。通常Cortex-M0 在0.8 DMIPS/MHz ,Cortex-M3 在1.25 DMIPS/MHz ,Cortex-A8 在2 DMIPS/MHz ,可做参考比较分界。
还有个Whetstone进行行浮点运算、整数算术运算、功能调用、数组变址、条件转移和超越函数的计算测试,其结果就是MFLOPS(Million Floating-point Operations per Second,每秒百万个浮点操作),这个MFLOPS经常用于表示计算中心超级计算机的计算能力。另外上个世纪70年代末开始还有较专业的LINPACK用于专门测试线性代数计算能力。
下图可看出计算中心机架上使用的intel的至强处理器可达117 CoreMark/MHz,而Tilera的则以低功耗大道理令人惊叹的230 CoreMark/MHz,每核在10~40万。目前台式机和笔记本常用的intel i5~i7大约在5~30 CoreMark/MHz范围,每核在1~3万。
扯远了,回归我们的STM32F769I-DISCO。
CoreMark
现在常用的CoreMark是一项测试处理器性能的基准测试。代码使用C语言写成,包含:链表、矩阵、状态机、CRC校验计算等,包括了基本的常用运算和基本浮点计算。EEMBC已经提供CoreMark pro版,对这几方面的测试进行了扩展增强,用更复杂繁重计算任务进行测试,虽然这些工作通常在嵌入控制系统中不常用。当然如果是机载航载、智能汽车、移动科学计算方面,也许可能就有需要了。
常做参考比较分界的是Cortex-M4, 2.19 CoreMark/MHz 和1.25 DMIPS/MHz 。强大的大约在CoreMark。就在216 MHz 处理器频率下性能达到 1082 CoreMark /462 DMIPS,这已经可以和前些年的台式机CPU相媲美。这次测试的STM32F769I-DISCO应该与此相当。
本评测
关于CoreMark测试,已经有鼠不胜数的资料,似乎真没必要人人都来测试,要知道这测试还真是技术活。即是EEMBC网站提供的测试数据都有5百多,只有极少数得到EEMBC认证。究其原因,是因为不同编译器设置会对测试结果有很大影响,降低了可比性。当然从统计规律看,这些测试还是有参考价值的。
对嵌入控制器,计算能力的增强是其从控制器向处理器提升的重要标志。就象我在前文所说,强大的计算能力为高性能的物控、物测、物连世界如多种信息现场收集融合、互连自动化、高端声音图象处理、复杂运动控制、甚至现场智能决策提供了可能。现在缺的就只是内存了,当然这对于针对每个具体单应用的控制系统,通常是不需要的。
分析了众多的测试例,即是STM32F769I-DISCO也已经有了可直接拿来使用的代码,直接照抄实在没意思啊。测试下来,我发现,面对STM32F769I-DISCO惊艳的屏,却是黑黑的,却用PC的串口、别人的串口监控接收程序去获得CoreMark测试结果。唉,这实在不爽啊。
没道理不用这美丽的屏去显示结果啊!!!
好吧,我时间有限,去移植STemWin实现显示虽然也不算难,只是惊艳的缺省例子是STemWin+RTOS,需要去掉OS很那许多美丽的图,还有些舍不得。那就直接使用LCD吧。
于是取出C:\Keil\ARM\Pack\Keil\STM32F7xx_DFP\2.8.0\Projects\STM32F769I-Discovery\Applications\Display\LCD_PicturesFromSDCard的部分代码,可简单实现屏幕显示,把CoreMark测试例中的测试报告输出转为屏幕显示,调用连接即可直接实现STM32F769I-DISCO自身屏幕显示的CoreMark测试。
使用keil uVision v5.15, ARMcc编译器5.05 update 2build 169,
编译条件 -c --cpu Cortex-M7.fp.sp--fpu=FPv4-SP -D__MICROLIB -g -O3 -Otime --apcs=interwork --split_ldm--split_sections
主要程序代码: |
int main(void) { CPU_CACHE_Enable(); SystemClock_Config();
HAL_Init();
LCD_Config();
BSP_LCD_Clear(LCD_COLOR_WHITE); //绘制初始画面 BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_SetFont(&LCD_DEFAULT_FONT); BSP_LCD_DisplayStringAtLine(4, (uint8_t*)" By okwh "); BSP_LCD_DisplayStringAtLine(10, (uint8_t*)" Wait Code Mark Testing..... "); BSP_LCD_DrawRect(10,10,780,460); // 两个长方形 BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DrawRect(20,20,760,440); BSP_LCD_SetTextColor(LCD_COLOR_RED); //3 X 2 个同心园 BSP_LCD_DrawCircle(400,240,100); BSP_LCD_DrawCircle(400,240,30); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DrawCircle(200,240,100); BSP_LCD_DrawCircle(200,240,30); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DrawCircle(600,240,100); BSP_LCD_DrawCircle(600,240,30); main00(); //计算并显示结果到屏幕 即原CoreMark的main } ……………原来转发到虚拟串口的,改为下面两句,写到屏幕 static char buffer[100]; 字符串 static int lnn=1; 屏幕行 sprintf(&buffer[0], "CoreMark Size : %lu", (ee_u32)results[0].size); BSP_LCD_DisplayStringAtLine(lnn++, buffer) ; ………………………….. 测试失败的原因通常是 计数器没有合适初始化、没有正确得到计数值 CORE_TICKS get_time(void) { CORE_TICKS elapsed = HAL_GetTick()- Tick ; return elapsed; }
|
|
|
测试结果: 883.52 CoreMark/216MHz = 4.09 CoreMark/MHz,低于别人IAR编译运行的结果。
如果你主要进行嵌入控制,那么那个IO操作的快慢大致就足够表示你的需要了,通常可用主频降频后可用于IO管脚状态翻转的频率来表示,再加上通讯速度、代码大小、存储空间,就足以用于判断选择嵌入控制系统的单片机。需要一些实时计算的系统才需要M4以上提供的浮点计算能力。
M7兼具 强大嵌入控制、强大DSP和浮点运算、强大图形加速、丰富接口的特点,CoreMark测试验证了其强大的计算能力,随板软件验证了其强大的图形显示和视频显示能力,丰富声频接口验证了其强大的声频能力,至于控制,当然嵌入控制器本来就是用于控制的,那是它的本能能力了。
本系列:
点击此处,查看STM32F769I开发板官方资源。