coremark github项目(https://github.com/eembc/coremark)
通过设置coremark运行开关,测试集可以完成以下设置
数据类型均为整型(有/无符号8、16、32位int)
【代码见core_list_join.c】
注意:每个单元格中的实际数据将是伪随机的,基于在编译时无法确定的输入。
【代码见core_matrix.c】
准备三个NxN矩阵:矩阵A将初始化为小值(upper 3/4 of the bits all zero)。矩阵B将初始化为中值(upper half of the bits all zero)。结果将使用矩阵C。
将A乘以一个常数到C,将结果矩阵中每个值的上半部分相加(add the upper bits of each of the values in the result matrix)。结果将成为输出链的一部分。
将A乘以B的X列到C中,将结果矩阵中每个值的上位相加。结果将成为输出链的一部分。
将A乘以B乘以C,将结果矩阵中每个值的上位相加。结果将成为输出链的一部分。
注意:A和B的实际值必须基于在编译时不可用的输入导出。
【代码见core_state.c】
这部分代码需要执行switch和if语句。因此,这部分代码使用一个小型摩尔状态机,它将字符串输入标识为数字,并根据格式对其进行划分。
状态机将解析输入字符串,直到遇到“,”分隔符或输入结束。无效数字将导致状态机返回无效状态,有效数字将导致状态机返回数字格式类型(int/float/scientific)。
在所有输入上调用状态机并计算最终状态和状态转换。所有最终状态和过渡的CRC将成为输出链的一部分。每隔一段时间修改输入(注入错误)并重复状态机操作。将输入修改回原始形式。
编译器在不断改进,在分析代码方面做得越来越好。而coremark的出现就是为了解决“Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是MCU或CPU的功能”的问题。因此要创建不能在编译时计算而必须在运行时计算的工作,因此coreMark 在嵌入式领域被认为比 Dhrystone 更加具有 表意义
从手册和书上找到三种较普遍的微体系结构的优化方法
将默认的静态预测改为动态预测(分支历史表BHT、N比特饱和计数器、分支目标缓冲器BTB)
E203无缓存,可以尝试设计调整ITCM与DTCM大小,或者接存储外设
CoreMark的分数最终表示为Iterations/Sec,也就是每秒迭代数