Page 1 of 1

将 CoreMark CPU跑分程序移植到 ESP32 上

Posted: Wed Nov 21, 2018 2:01 pm
by Xiong Yu
Html:

http://blog.emake.run/CoreMark.html

Markdown:

## 将 CoreMark CPU跑分程序移植到 ESP32 上

_测试中,未针对ESP32优化, 仅供参考_

[前言]

- 衡量处理器的一个重要指标是功耗,另外一个重要指标便是性能。在处理器领域的 Benchmarks 非常众多,有某些个人开发的程序,也有某些标准组织,或者商业公司开发的Benchmarks, 本文在此不加以一一枚举。 在嵌入式处理器领域最为知名和常见的 Benchmarks 为Dhrystone 和 CoreMark。

- CoreMark是一个综合基准,用于测量嵌入式系统中使用的中央处理器(CPU)的性能。它是在2009由eembc的shay gal-on开发的,旨在成为一个行业标准,取代过时的dehrystone基准。代码用C编写,包含以下算法:列表处理(增删改查和排序)、矩阵操作(公共矩阵操作)、状态机(确定输入流是否包含有效数字)和CRC。用户可以自由的下载Coremark,并移植到自己的平台上运行,随后就可以看到分数。

[在ESP32上新建CoreMark工程]

- 拷贝hello_world例程

```bash
cp -r $IDF_PATH/examples/get-started/hello_world CoreMark
```

- clone `coremark`

```bash
cd CoreMark
git clone https://github.com/eembc/coremark.git
```

- 将测试代码拷贝出来

```bash
cd coremark
cp core_list_join.c core_main.c coremark.h core_matrix.c core_state.c core_util.c simple/core_portme.c simple/core_portme.h ../main/
cd ..
rm -rf coremark main/hello_world_main.c
```

- 修改`core_portme.c`文件

- 将`ITERATIONS`替换为你需要的迭代次数

- 38行
```c
volatile ee_s32 seed4_volatile=ITERATIONS;
```
->
```c
volatile ee_s32 seed4_volatile=10000;
```

- 修改`core_portme.h`文件

- 将`FLAGS_STR`替换为`"-Os"`
- 77行
```c
#define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */
```
->
```c
#define COMPILER_FLAGS "-Os" /* "Please put compiler flags here (e.g. -o3)" */
```
- 将`MAIN_HAS_NOARGC`宏定义为1
- 159行
```c
#define MAIN_HAS_NOARGC 0
```
->
```c
#define MAIN_HAS_NOARGC 1
```

- 修改`core_main.c`文件

- 将`main`替换为`app_main`
- 89行
```c
MAIN_RETURN_TYPE main(void) {
```
->
```c
MAIN_RETURN_TYPE app_main(void) {
```
- 将`%lu`替换为`%u`

- 287行
```c
ee_printf("CoreMark Size : %lu\n",(ee_u32)results[0].size);
```
->
```c
ee_printf("CoreMark Size : %u\n",(ee_u32)results[0].size);
```
- 288行
```c
ee_printf("Total ticks : %lu\n",(ee_u32)total_time);
```
->
```c
ee_printf("Total ticks : %u\n",(ee_u32)total_time);
```
- 303行
```c
ee_printf("Iterations : %lu\n",(ee_u32)default_num_contexts*results[0].iterations);
```
->
```c
ee_printf("Iterations : %u\n",(ee_u32)default_num_contexts*results[0].iterations);
```

- 配置`menuconfig`

```bash
make menuconfig
```
- 调整编译优化等级

`Compiler options → Optimization Level`

```bash
(X) Debug (-Og)
( ) Release (-Os)
```
->
```bash
( ) Debug (-Og)
(X) Release (-Os)
```

- 关闭`watchdog`

`Component config → ESP32-specific`

```bash
[*] Interrupt watchdog
```
->
```bash
[ ] Interrupt watchdog
```
- 调整`CPU frequency`

`Component config → ESP32-specific → CPU frequency`

```bash
( ) 80MHz
(X) 160MHz
( ) 240MHz
```
->
```bash
( ) 80MHz
( ) 160MHz
(X) 240MHz
```

- 目录树

```bash
tree -L 2
.
├── CMakeLists.txt
├── main
│ ├── CMakeLists.txt
│ ├── component.mk
│ ├── core_list_join.c
│ ├── core_main.c
│ ├── coremark.h
│ ├── core_matrix.c
│ ├── core_portme.c
│ ├── core_portme.h
│ ├── core_state.c
│ └── core_util.c
├── Makefile
├── README.md
├── sdkconfig
└── sdkconfig.old
```

- 编译下载

```bash
make -j4 flash monitor
```

[测试结果]

```bash
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 28190
Total time (secs): 28.190000
Iterations/Sec : 354.735722
Iterations : 10000
Compiler version : GCC5.2.0
Compiler flags : -Os
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x988c
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 354.735722 / GCC5.2.0 -Os / STACK
```

Re: 将 CoreMark CPU跑分程序移植到 ESP32 上

Posted: Thu Nov 22, 2018 2:56 am
by ESP_HengYC
goooood job! :lol:

Re: 将 CoreMark CPU跑分程序移植到 ESP32 上

Posted: Thu Nov 22, 2018 1:05 pm
by littlesky
Is there any comparison with other CPUs?

Re: 将 CoreMark CPU跑分程序移植到 ESP32 上

Posted: Mon Nov 26, 2018 1:25 pm
by Xiong Yu
"https://www.eembc.org/coremark/scores.php"

This site has performance rankings for other processors.

Others have used esp32's dual core to run to 700 points.