RISC-V MCU中文社区

【分享】 Coremark测试集分析与性能优化思路

发表于 全国大学生集成电路创新创业大赛 2023-05-25 12:42:12
0
2381
2

团队编号:CICC1156

团队名称:兔飞猛进

1. 项目说明文档:

coremark github项目(https://github.com/eembc/coremark)

2. 配置和使用

通过设置coremark运行开关,测试集可以完成以下设置

- 交叉编译选项
- 并行多线程
- 设置迭代次数

3. 测试集主要算法

数据类型均为整型(有/无符号8、16、32位int)

a. 列表处理

【代码见core_list_join.c】

1.查找、基于值的归并排序、基于idx的归并排序,输出结果
2.最终将保证列表在离开函数之前返回到原始状态,从而使每次迭代得到相同的结果
3.输出CRC效验

注意:每个单元格中的实际数据将是伪随机的,基于在编译时无法确定的输入。

b. 矩阵操作

【代码见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的实际值必须基于在编译时不可用的输入导出。

c. 状态机

【代码见core_state.c】
这部分代码需要执行switch和if语句。因此,这部分代码使用一个小型摩尔状态机,它将字符串输入标识为数字,并根据格式对其进行划分。

状态机将解析输入字符串,直到遇到“,”分隔符或输入结束。无效数字将导致状态机返回无效状态,有效数字将导致状态机返回数字格式类型(int/float/scientific)。

在所有输入上调用状态机并计算最终状态和状态转换。所有最终状态和过渡的CRC将成为输出链的一部分。每隔一段时间修改输入(注入错误)并重复状态机操作。将输入修改回原始形式。

4. 设计意图

编译器在不断改进,在分析代码方面做得越来越好。而coremark的出现就是为了解决“Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是MCU或CPU的功能”的问题。因此要创建不能在编译时计算而必须在运行时计算的工作,因此coreMark 在嵌入式领域被认为比 Dhrystone 更加具有 表意义

(1) 一些系统函数(例如time, scanf)和参数不能在编译时计算。在大多数情况下,将变量标记为volatile意味着编译器在每次读取该变量时都必须读取它。这将用于在输入中引入一个不能在编译时预先计算的因子。由于结果依赖于输入,这将确保计算必须在运行时进行
(2) 在运行时提供的实际值将是标准化的。该方法并不打算提供随机数据,而只是提供在编译时无法预先计算的受控数据。

5. 可能的优化

从手册和书上找到三种较普遍的微体系结构的优化方法

(1) 分支预测技术:

将默认的静态预测改为动态预测(分支历史表BHT、N比特饱和计数器、分支目标缓冲器BTB)

(2) 存储空间优化:

E203无缓存,可以尝试设计调整ITCM与DTCM大小,或者接存储外设

(3) 优化乘除法等长周期模块

(4) 借助协处理器拓展指令

6.模拟测试

CoreMark的分数最终表示为Iterations/Sec,也就是每秒迭代数

7. 参考资料

CPU性能测试——CoreMark篇 - Imagine_Miracle - 博客园 (cnblogs.com)

喜欢2
用户评论
锟斤拷

锟斤拷 实名认证

手持两把锟斤拷,口中疾呼烫烫烫。脚踏千朵屯屯屯,笑看万物锘锘锘

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板