1903_CoreMark白皮书阅读笔记
全部学习汇总: g_embedded: 嵌入式通用技术学习笔记 (gitee.com)
再看ARM的内核架构介绍的时候看到了不同的内核都测试了一个CoreMark/Mhz的参数。从名称看,可以理解为是MCU的算力跑分。至于这部分究竟是测试了哪些功能,接下来跟着白皮书卡一下。
白皮书的文件是可以从Embedded Microprocessor Benchmark Consortium网站上获取的。
CoreMark结果是一个数字,可以用来衡量CPU的运算能力。DMIPS以及BogoMIPS是从其他的角度做了一些类似的测试。
CoreMark是为了能够做到简单且标准化的测试而制定的,可以免费下载(这么看应该是源代码)。设计采用了常见的数据结构和算法,而且用到的运算都是在运行的过程中计算出来的从而避免编译器优化带来的影响。运行的方法以及报告方式也做了标准化的要求。
CoreMark的内容主要是链表处理、矩阵运算、以及状态机跳转。其中,链表会进行翻转、搜索、排序等操作对指针的处理、分散内存的访问等进行测试。如果链表的大小超过了Cache的大小,还可以同时测试内存以及缓存的层级结构的效率。为了检查结果的准确性,还对内容进行了CRC的校验,而CRC校验一者是可以判断对错;二者可以顺便考察一下运算能力。而状态机的跳转主要是用来测试条件分支的执行效率。
链表节点的数据结构中包括数据对象以及index。其中,index的存在是为了记录在排序中的位置。这种设计方式可以在内存比较小的平台上使用,同时避免了使用标准库进行存储的申请分配等操作。这种设计让我联想到了FreeRTOS的链表设计。
无论是什么平台,对比时候链表的节点数目都是相同的。因此,对比的时候主要看数据量而不看实际的内存消耗。
矩阵运算的主要目的是测试循环、MAC等设计。这个过程中同样采用了CRC来进行内容准确性的校验。
状态机一般可以使用switch或者if条件分支来实现,主要的测试点就是MCU的条件分支判断而非循环。
默认情况下,CoreMark需要2KB的存储来存储用到的数据。这么小的内存的需求量在一些低端的嵌入式MCU上都是可以满足的。不过,结合前面的信息我倒好奇,如果都是这么大的话再很多高端的MCU上岂不是会大量使用Cache从而导致得分虚高?
这个是一个基本的测试结果的展示,涉及到了不同的主频下的表现、不同的编译器版本的表现以及相同的MCU和编译器但是不同编译选项的表现。上面所有内容一直但是结果不同的两个就是编译选项不同,这个在文档的后续内容中给出了说明。
另外,从上面的信息看。商用的编译器看起来在效率上通常会比gcc要好一些,而gcc随着版本的升级也在不断改善生成代码在效率上的质量表现。