微控制器CPU性能测试基准~

嵌入式资讯精选 2021-06-16 11:55

今天痞子衡给大家介绍的是微控制器CPU性能测试基准CoreMark

在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone、MIPS、CoreMark,其中CoreMark是一种新兴流行的嵌入式系统处理器测试基准,被认为是比Dhrystone和MIPS更具有实际价值的测试基准。今天痞子衡就和大家详细聊一聊CoreMark。

一、EEMBC协会

在讲CoreMark之前,必须要先提EEMBC(Embedded Microprocessor Benchmark Consortium)即嵌入式微处理器基准评测协会,它是一个非盈利性组织,该组织目前共发布了46个性能测试基准,有了这些性能基准参考,嵌入式设计人员可以快速有效地选择处理器。

EEMBC测试是基于每秒钟算法执行的次数和编译代码大小的综合统计结果。众所周知,编译器选项会对代码大小和执行效率会产生巨大的影响,所以每种测试必须包括足够多的编译器信息并设置不同的优化项。

EEMBC发展势头很好,其很有可能发展成为嵌入式系统开发人员进行处理器和编译器性能比较的工业标准。关于EEMBC的更多介绍可移步它的官方网站 http://www.eembc.org/

二、CoreMark标准

CoreMark是由EEMBC的Shay Gla-On于2009年提出的一项基准测试程序,其主要目标是测试处理器核心性能。

CoreMark标准的测试方法很简单,就是在某配置参数组合下单位时间内跑了多少次CoreMark程序,其指标单位为CoreMark/MHz。CoreMark数字越高,意味着性能更高。

2.1 获取程序

CoreMark程序的目前最新版本是1.01。

核心程序下载 http://www.eembc.org/coremark/download.php
平台移植示例 http://www.eembc.org/coremark/ports.php

核心程序包下载后,在\coremark_v1.0\readme.txt里可见基本介绍,在\coremark_v1.0\docs\Coremark-requirements.doc里可见设计需求。详细文件目录如下:

\coremark_v1.0
\barebones --移植到裸机下需要修改的文件
\core_portme.h -- 移植平台工程具体配置信息
\core_portme.c -- 计时以及板级初始化实现
\cvt.c
\ee_printf.c -- 打印函数串口发送实现
\cygwin --移植到cygwin下需要修改的文件
\linux --移植到linux下需要修改的文件
\linux64 --移植到linux64下需要修改的文件
\simple --基本移植需要修改的文件

core_main.c --主程序入口
core_state.c --状态机控制子程序
core_list_join.c --列表操作子程序
core_matrix.c --矩阵运算子程序
core_util.c --CRC计算子程序
coremark.h --工程配置与数据结构定义

\docs --设计文档
coremark.md5
LICENSE.txt
Makefile
readme.txt --基本介绍
release_notes.txt --版本说明

如果是移植到ARM Cortex-M平台下裸系统运行,一般只需要修改\barebones目录下的文件即可(仅需改动三个函数portable_init()、barebones_clock()、uart_send_char()以及core_portme.h中若干宏定义),其余代码文件不需要修改。关于\barebones下的文件修改,EEMBC上有如下4个示例平台可参考:

2.2 配置参数

前面讲到做平台移植时除了必须要改动3个函数外,还需要设置core_portme.h中若干宏定义,这些宏定义即为配置参数,需要根据要移植到的具体平台的属性而定。一共如下14个宏:

解释示例
HAS_FLOATDefine to 1 if the platform supports floating point1
HAS_TIME_HDefine to 1 if platform has the time.h header file and implementation of functions thereof0
USE_CLOCKDefine to 1 if platform has the time.h header file and implementation of functions thereof0
HAS_STDIODefine to 1 if the platform has stdio.h.0
HAS_PRINTFDefine to 1 if the platform has stdio.h and implements the printf function.0
COMPILER_VERSIONPlease put compiler version here (e.g. gcc 4.1)"IAR EWARM v8.20.2"
COMPILER_FLAGSPlease put compiler flags here (e.g. -o3)"High - Speed - No size constraints"
MEM_LOCATIONPlease put the mem location of code execution here (e.g STACK)"STACK"
CORETIMETYPEDefine type of return from the timing functions.ee_u32
SEED_METHODDefines method to get seed values that cannot be computed at compile time.SEED_VOLATILE
MEM_METHODDefines method to get a block of memry.MEM_STATIC
MULTITHREADDefine for parallel execution1
MAIN_HAS_NOARGCNeeded if platform does not support getting arguments to main.1
MAIN_HAS_NORETURNNeeded if platform does not support returning a value from main.0

细心的朋友应该能注意到core_portme.h文件的最后有如下条件编译,实际上CoreMark主程序的运行有3种模式可选,即PROFILE_RUN(原型模式)/PERFORMANCE_RUN(性能模式)/VALIDATION_RUN(验证模式)

#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) && !defined(VALIDATION_RUN)
#if (TOTAL_DATA_SIZE==1200)
#define PROFILE_RUN 1
#elif (TOTAL_DATA_SIZE==2000)
#define PERFORMANCE_RUN 1
#else
#define VALIDATION_RUN 1
#endif
#endif

而在coremark.h文件的最开始就定义了缺省的TOTAL_DATA_SIZE的值为2000,即CoreMark程序默认跑在PERFORMANCE_RUN(性能模式)下。如果你想修改运行模式,需要在编译器预编译选项里自定义TOTAL_DATA_SIZE。

/* Configuration: TOTAL_DATA_SIZE
 Define total size for data algorithms will operate on
*/

#ifndef TOTAL_DATA_SIZE 
#define TOTAL_DATA_SIZE 2*1000
#endif

2.3 程序解析

CoreMark程序使用C语言写成,包含如下四类运算法则:数学矩阵操作(普通矩阵运算)、列举(寻找并排序)、状态机(用来确定输入流中是否包含有效数字)、CRC(循环冗余校验),都是在真实的嵌入式应用中很常见的操作,这也是CoreMark比其他测试标准更有实际价值的原因所在。

a. Matrix multiply (allow for use of MAC operations, common math use)
b. Linked list search/sort/read (common pointer use)
c. State machine (common use of data dependent branches)
d. CRC (common in embedded)

让我们尝试分析CoreMark主函数入口main(以2.2节中配置示例值为例):

/* Function: main
 Main entry routine for the benchmark.
 This function is responsible for the following steps:

 1 - Initialize input seeds from a source that cannot be determined at compile time.
 2 - Initialize memory block for use.
 3 - Run and time the benchmark.
 4 - Report results, testing the validity of the output if the seeds are known.

 Arguments:
 1 - first seed  : Any value
 2 - second seed : Must be identical to first for iterations to be identical
 3 - third seed  : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
 4 - Iterations  : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs

*/

MAIN_RETURN_TYPE main(void) {
 int argc=0;
 char *argv[1];
 ee_u16 i,j=0,num_algorithms=0;
 ee_s16 known_id=-1,total_errors=0;
 ee_u16 seedcrc=0;
 CORE_TICKS total_time;
 core_results results[MULTITHREAD];

 // 系统板级初始化
 portable_init(&(results[0].port), &argc, argv);

 // ...
 // 设置PERFORMANCE_RUN的初始参数
 results[0].seed1=get_seed(1);  //0x0
 results[0].seed2=get_seed(2);  //0x0
 results[0].seed3=get_seed(3);  //0x66
 results[0].iterations=get_seed_32(4);  //ITERATIONS
 // execs参数为需要跑的算法使能位
 results[0].execs=get_seed_32(5);       //0x0
 if (results[0].execs==0) { /* if not supplied, execute all algorithms */
  results[0].execs=ALL_ALGORITHMS_MASK;
 }
 // ...

 results[0].memblock[0]=(void *)static_memblk;
 results[0].size=TOTAL_DATA_SIZE;
 results[0].err=0;

 /* Data init */ 
 /* Find out how space much we have based on number of algorithms */
 // ...

 // 各算法子程序初始化(共LIST, MATRIX, STATE三种)
 for (i=0 ; i<MULTITHREAD; i++) {
  if (results[i].execs & ID_LIST) {
   results[i].list=core_list_init(results[0].size,results[i].memblock[1],results[i].seed1);
  }
  if (results[i].execs & ID_MATRIX) {
   core_init_matrix(results[0].size, results[i].memblock[2], (ee_s32)results[i].seed1 | (((ee_s32)results[i].seed2) << 16), &(results[i].mat) );
  }
  if (results[i].execs & ID_STATE) {
   core_init_state(results[0].size,results[i].seed1,results[i].memblock[3]);
  }
 }

 /* automatically determine number of iterations if not set */
 // ...

 // 开始跑CoreMark程序且记录累计消耗时间
 start_time();
 iterate(&results[0]);
 stop_time();
 total_time=get_time();

    // ...
 // 最终信息的打印
    // ...
 if (total_errors==0) {
  ee_printf("Correct operation validated. See readme.txt for run and reporting rules.\n");
  if (known_id==3) {
   ee_printf("CoreMark 1.0 : %f / %s %s",default_num_contexts*results[0].iterations/time_in_secs(total_time),COMPILER_VERSION,COMPILER_FLAGS);
   ee_printf("\n");
  }
 }
    // ...

 /* And last call any target specific code for finalizing */
 portable_fini(&(results[0].port));

 return MAIN_RETURN_VAL; 
}

2.4 结果格式

当移植好CoreMark程序后,便可以开始跑起来了,在跑程序的时候,EEMBC同时制定了必须要遵守规则(不遵守的话,跑分结果不被EEMBC所认可),详见 https://www.eembc.org/coremark/CoreMarkRunRules.pdf。

当得到跑分结果后可将结果提交到EEMBC网站上,跑分结果需按如下标准格式进行提交:

	CoreMark 1.0 : N / C [/ P] [/ M]

N - Number of iterations per second with seeds 0,0,0x66,size=2000)
C - Compiler version and flags
P - Parameters such as data and code allocation specifics
- This parameter *may* be omitted if all data was allocated on the heap in RAM.
- This parameter *may not* be omitted when reporting CoreMark/MHz
M - Type of parallel execution (if used) and number of contexts
This parameter may be omitted if parallel execution was not used.

e.g.
> CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2
or
> CoreMark 1.0 : 1400 / GCC 3.4 -O4

If reporting scaling results, the results must be reported as follows:

CoreMark/MHz 1.0 : N / C / P [/ M]

P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio.
- If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included.

e.g.
> CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache

如果移植的CoreMark能够正确运行,你应该可以看到串口会打印出类似如下格式的信息,上述要求的CoreMark标准结果就在打印信息的最后。

2K performance run parameters for coremark. (Run type)
CoreMark Size : 666 (Buffer size)
Total ticks : 25875 (platform dependent value)
Total time (secs) : 25.875000 (actual time in seconds)
Iterations/Sec : 3864.734300 (Performance value to report)
Iterations : 100000 (number of iterations used)
Compiler version : GCC3.4.4 (Compiler and version)
Compiler flags : -O2 (Compiler and linker flags)
Memory location : Code in flash, data in on chip RAM
seedcrc : 0xe9f5 (identifier for the input seeds)
[0]crclist : 0xe714 (validation for list part)
[0]crcmatrix : 0x1fd7 (validation for matrix part)
[0]crcstate : 0x8e3a (validation for state part)
[0]crcfinal : 0x33ff (iteration dependent output)
Correct operation validated. See readme.txt for run and reporting rules. (*Only when run is successful*)
CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap (*Only on a successful performance run*)

2.5 跑分榜

截止到目前,EEMBC网站共记录535款微控制器的CoreMark跑分结果(注意并不是所有跑分结果都经过EEMBC核实),所有跑分结果可在这里查询 https://www.eembc.org/coremark/scores.php,下图是跑分榜部分结果(按提交日期排序)。如果是设计人员根据性能选型的话,可以选按得分高低排序。

2.6 结果示例

在上节介绍的跑分榜里可点击微控制器型号查看具体结果,也可选择多个微控制器进行结果对比。最近两家ARM Cortex-M微控制器知名厂商恩智浦半导体和意法半导体在高性能微控制器上正一决雌雄,恩智浦推出的i.MX RT1050和意法半导体推出的STM32H743均是基于Cortex-M7内核,我们且来比比看这两款微控制器:

 

从对比结果来看,i.MX RT1050在性能上完爆STM32H743,其3036的总得分在Cortex-M微控制器里独孤求败,这个跑分结果虽未经过EEMBC认证,但与恩智浦官方给的数据3020基本吻合。

关于i.MX RT系列微控制器简介可详见我的另一篇文章 飞思卡尔i.MX RT系列微控制器介绍篇(1)- 概览,对于i.MX RT1050跑分结果的验证与复现可详见我的文章 飞思卡尔i.MX RT系列微控制器介绍篇(2)- 性能CoreMark。

至此,微控制器CPU性能测试基准CoreMark痞子衡便介绍完毕了,掌声在哪里~~~

1.如何应对AIoT对芯片的碎片化需求?

2.2021你值得入手的嵌入式系统线上课程在这里!

3.嵌入式编程中使用qemu能够做什么?

4.曝英特尔拟20亿美元收购SiFive!

5.英伟达的阳谋,收购Arm的危险讯号︱调研英伟达收购Arm影响

6.华为官方通知:鸿蒙不再属于华为!

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

嵌入式资讯精选 掌握最鲜资讯,尽领行业新风
评论 (0)
  • 4月22日下午,备受瞩目的飞凌嵌入式「2025嵌入式及边缘AI技术论坛」在深圳深铁皇冠假日酒店盛大举行,此次活动邀请到了200余位嵌入式技术领域的技术专家、企业代表和工程师用户,共享嵌入式及边缘AI技术的盛宴!1、精彩纷呈的展区产品及方案展区是本场活动的第一场重头戏,从硬件产品到软件系统,从企业级应用到高校教学应用,都吸引了现场来宾的驻足观看和交流讨论。全产品矩阵展区展示了飞凌嵌入式丰富的产品线,从嵌入式板卡到工控机,从进口芯片平台到全国产平台,无不体现出飞凌嵌入式在嵌入式主控设备研发设计方面的
    飞凌嵌入式 2025-04-28 14:43 149浏览
  • 随着电子元器件的快速发展,导致各种常见的贴片电阻元器件也越来越小,给我们分辨也就变得越来越难,下面就由smt贴片加工厂_安徽英特丽就来告诉大家如何分辨的SMT贴片元器件。先来看看贴片电感和贴片电容的区分:(1)看颜色(黑色)——一般黑色都是贴片电感。贴片电容只有勇于精密设备中的贴片钽电容才是黑色的,其他普通贴片电容基本都不是黑色的。(2)看型号标码——贴片电感以L开头,贴片电容以C开头。从外形是圆形初步判断应为电感,测量两端电阻为零点几欧,则为电感。(3)检测——贴片电感一般阻值小,更没有“充放
    贴片加工小安 2025-04-29 14:59 207浏览
  • 网约车,真的“饱和”了?近日,网约车市场的 “饱和” 话题再度引发热议。多地陆续发布网约车风险预警,提醒从业者谨慎入局,这背后究竟隐藏着怎样的市场现状呢?从数据来看,网约车市场的“过剩”现象已愈发明显。以东莞为例,截至2024年12月底,全市网约车数量超过5.77万辆,考取网约车驾驶员证的人数更是超过13.48万人。随着司机数量的不断攀升,订单量却未能同步增长,导致单车日均接单量和营收双双下降。2024年下半年,东莞网约出租车单车日均订单量约10.5单,而单车日均营收也不容乐
    用户1742991715177 2025-04-29 18:28 209浏览
  • 贞光科技代理品牌紫光国芯的车规级LPDDR4内存正成为智能驾驶舱的核心选择。在汽车电子国产化浪潮中,其产品以宽温域稳定工作能力、优异电磁兼容性和超长使用寿命赢得市场认可。紫光国芯不仅确保供应链安全可控,还提供专业本地技术支持。面向未来,紫光国芯正研发LPDDR5车规级产品,将以更高带宽、更低功耗支持汽车智能化发展。随着智能网联汽车的迅猛发展,智能驾驶舱作为人机交互的核心载体,对处理器和存储器的性能与可靠性提出了更高要求。在汽车电子国产化浪潮中,贞光科技代理品牌紫光国芯的车规级LPDDR4内存凭借
    贞光科技 2025-04-28 16:52 236浏览
  • 文/郭楚妤编辑/cc孙聪颖‍越来越多的企业开始蚕食动力电池市场,行业“去宁王化”态势逐渐明显。随着这种趋势的加强,打开新的市场对于宁德时代而言至关重要。“我们不希望被定义为电池的制造者,而是希望把自己称作新能源产业的开拓者。”4月21日,在宁德时代举行的“超级科技日”发布会上,宁德时代掌门人曾毓群如是说。随着宁德时代核心新品骁遥双核电池的发布,其搭载的“电电增程”技术也走进业界视野。除此之外,经过近3年试水,宁德时代在换电业务上重资加码。曾毓群认为换电是一个重资产、高投入、长周期的产业,涉及的利
    华尔街科技眼 2025-04-28 21:55 154浏览
  • 一、gao效冷却与控温机制‌1、‌冷媒流动设计‌采用低压液氮(或液氦)通过毛细管路导入蒸发器,蒸汽喷射至样品腔实现快速冷却,冷却效率高(室温至80K约20分钟,至4.2K约30分钟)。通过控温仪动态调节蒸发器加热功率,结合温度传感器(如PT100铂电阻或Cernox磁场不敏感传感器),实现±0.01K的高精度温度稳定性。2、‌宽温区覆盖与扩展性‌标准温区为80K-325K,通过降压选件可将下限延伸至65K(液氮模式)或4K(液氦模式)。可选配475K高温模块,满足材料在ji端温度下的性能测试需求
    锦正茂科技 2025-04-30 13:08 205浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 270浏览
  • 在CAN总线分析软件领域,当CANoe不再是唯一选择时,虹科PCAN-Explorer 6软件成为了一个有竞争力的解决方案。在现代工业控制和汽车领域,CAN总线分析软件的重要性不言而喻。随着技术的进步和市场需求的多样化,单一的解决方案已无法满足所有用户的需求。正是在这样的背景下,虹科PCAN-Explorer 6软件以其独特的模块化设计和灵活的功能扩展,为CAN总线分析领域带来了新的选择和可能性。本文将深入探讨虹科PCAN-Explorer 6软件如何以其创新的模块化插件策略,提供定制化的功能选
    虹科汽车智能互联 2025-04-28 16:00 180浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 173浏览
  • 在智能硬件设备趋向微型化的背景下,语音芯片方案厂商针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三个方面进行详细介绍。一、超小体积封装:QFN技术的核心优势WTV系列与WT2003H系列均提供QFN封装(如QFN32,尺寸为4×4mm),这种封装形式具有以下特点:体积紧凑:QFN封装通过减少引脚间距和优化内部结构,显著缩小芯片体积,适用于智能门铃、穿戴设备
    广州唯创电子 2025-04-30 09:02 211浏览
  • 文/Leon编辑/cc孙聪颖‍2023年,厨电行业在相对平稳的市场环境中迎来温和复苏,看似为行业增长积蓄势能。带着对市场向好的预期,2024 年初,老板电器副董事长兼总经理任富佳为企业定下双位数增长目标。然而现实与预期相悖,过去一年,这家老牌厨电企业不仅未能达成业绩目标,曾提出的“三年再造一个老板电器”愿景,也因市场下行压力面临落空风险。作为“企二代”管理者,任富佳在掌舵企业穿越市场周期的过程中,正面临着前所未有的挑战。4月29日,老板电器(002508.SZ)发布了2024年年度报告及2025
    华尔街科技眼 2025-04-30 12:40 199浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦