【VisionFive 2:集成3D GPU RISC-V单板计算机】+02.CPU/DDR功能测试(zmj)
赛昉科技的“昉·星光 2”开发板采用“昉·惊鸿7110(JH7110)”处理器,它是RISC-V 四核,指令集ISA为64位RV64GC ISA SoC,并且搭载2MB的L2缓存和协处理器,工作频率最高可达1.5 GHz(GPU是IMG BXE-4-32 MC1,工作频率最高可达600 MHz,本节内容不做展开)。系统内存配置为4GB-LPDDR4 SDRAM,数据传输速率最高可达 2800 Mbps(DDR内存可选2GB/4GB/8GB)。
本章节测试“昉·星光 2”开发板的CPU/DDR功能。
1. CPU性能测试
1.1 查看CPU信息
赛昉科技的“昉·星光 2”开发板采用“昉·惊鸿7110(JH7110)”处理器,指令集ISA架构为RSIC-V 64位,搭载2MB大小的L2-Cache缓存和协处理器,工作频率范围是312.5MHz~1.5GHz;搭载GPU是IMG BXE-4-32 MC1,工作频率最高可达600 MHz。
通过查看CPU信息的反馈结果可以确认CPU是四核RSIC-V(64-bit模式),L2-Cache大小为2MB。
//------查看CPU信息:lscpu
//---指令
lscpu
cat /proc/cpuinfo
//---结果
指令集:RSIC-V 64bit
4核CPU:编号0~3
//------查看CPU频率:
//---指令
sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_cur_freq
sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_max_freq
sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_min_freq
//---结果
工作频率:312.5MHz~1.5GHz
当前频率:750MHz
//------log信息(示例)
user@starfive:~/zmj_ws/5_coremark/coremark$ lscpu
Architecture: riscv64
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
user@starfive:~/zmj_ws/5_coremark/coremark$ cat /proc/cpuinfo
processor : 0
hart : 1
isa : rv64imafdc
mmu : sv39
isa-ext :
uarch : sifive,u74-mc
processor : 1
hart : 2
isa : rv64imafdc
mmu : sv39
isa-ext :
uarch : sifive,u74-mc
processor : 2
hart : 3
isa : rv64imafdc
mmu : sv39
isa-ext :
uarch : sifive,u74-mc
processor : 3
hart : 4
isa : rv64imafdc
mmu : sv39
isa-ext :
uarch : sifive,u74-mc
user@starfive:~/zmj_ws/5_coremark/coremark$ sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_cur_freq
750000
user@starfive:~/zmj_ws/5_coremark/coremark$ sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_max_freq
1500000
user@starfive:~/zmj_ws/5_coremark/coremark$ sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_min_freq
312500
user@starfive:~/zmj_ws/5_coremark/coremark$ hostnamectl
Static hostname: starfive
Icon name: computer
Machine ID: b0c15c2d3a1843d486fe35272f9f72ef
Boot ID: e9058acac80f4749a9d9c875710167ba
Operating System: Debian GNU/Linux bookworm/sid
Kernel: Linux 5.15.0-starfive
Architecture: riscv64
user@starfive:~/zmj_ws/5_coremark/coremark$
1.2 CoreMark性能测试
1.2.1 CoreMark简介
//------CoreMark简介
CoreMark是用来衡量嵌入式系统中心处理单元(CPU,或叫做微控制器MCU)性能的标准。
该标准于2009年由EEMBC组织的Shay Gla-On提出,并且试图将其发展成为工业标准,从而代替陈旧的Dhrystone标准。代码使用C语言写成,包含如下的运算法则:列举(寻找并排序),数学矩阵操作(普通矩阵运算)和状态机(用来确定输入流中是否包含有效数字),最后还包括CRC(循环冗余校验)。
CoreMark是由EEMBC(Embedded Microprocessor Benchmark Consortium)的Shay Gla-On于2009年提出的一项基准测试程序,CoreMark的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。
目前在嵌入式CPU行业中普遍公认的性能测试指标的标准主要使用以下三种,MIPS、Dhrystone、Coremark,而CoreMark与Dhrystone一样,拥有体积小、方便移植、易于理解、免费并且显示单个数字基准分数。与Dhrystone不同的是,Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是实际MCU或CPU的能力,的性能,而CoreMark具有特定的运行和报告规则,从而可以避免由于所使用的编译库不同而导致的测试结果难以比较。
1.2.2 CoreMark源码获取
//------CoreMark源码获取
EEMBC 在将 CoreMark 源码托管在 GitHub 上可以访问github.com/eembc/coremark直接点击下载获得源码;也可以通过 git 命令下载到本地。
//------CoreMark源码获取
//---直接下载
https://github.com/eembc/coremark
//---Git下载
git clone https://github.com/eembc/coremark.git
//---编译
make run
CoreMark 项目的详细介绍,可以查阅当前目录下 “coremark/docs/html/index.html” 。以下是当前目录的每个文件介绍:
#在tree命令的输出中,作了部分删除(不影响分析整个CoreMark工程)
imaginemiracle@:coremark$ tree
.
├── barebones --移植到裸机环境下需要修改的目录
│ ├── core_portme.c --移植的目标平台配置信息
│ ├── core_portme.h --计时以及板级初始化实现
│ ├── core_portme.mak --该子目录的makefile
│ ├── cvt.c
│ └── ee_printf.c --打印函数串口发送实现
├── core_list_join.c --列表操作程序
├── core_main.c --主程序
├── coremark.h --项目配置与数据结构的定义头文件
├── coremark.md5
├── core_matrix.c --矩阵运算程序
├── core_state.c --状态机控制程序
├── core_util.c --CRC计算程序
├── cygwin --x86 cygwin和gcc 3.4(四核,双核和单核系统)的测试代码
│ ├── core_portme.c
│ ├── core_portme.h
│ └── core_portme.mak
├── freebsd --以下同理,是在不同操作系统下的测试代码
│ ├── ...
├── LICENSE.md
├── linux
│ ├── ...
├── linux64
│ ├── ...
├── macos
│ ├── ...
├── Makefile
├── README.md --自述文件,CoreMark项目的基本介绍
├── rtems
│ ├── ...
└──simple
├── ...
└── core_portme.mak
1.2.3 运行coremark.exe测试性能
运行coremark.exe测试性能,测试得分666分,性能高于4核A53。
//------CoreMark性能测试
user@starfive:~/zmj_ws/5_coremark/coremark$ ./coremark.exe
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 22792
Total time (secs): 22.792000
Iterations/Sec : 4826.254826
Iterations : 110000
Compiler version : GCC12.2.0
Compiler flags : -O2 -DPERFORMANCE_RUN=1 -lrt
Memory location : Please put data memory location here
(e.g. code in flash, data on heap etc)
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x33ff
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 4826.254826 / GCC12.2.0 -O2 -DPERFORMANCE_RUN=1 -lrt / Heap
user@starfive:~/zmj_ws/5_coremark/coremark$
2. DDR内存性能测试
赛昉科技的“昉·星光 2”开发板采用4GB的LPDDR4-SDRAM, 数据传输速率最高可达 2800 Mbps(DDR内存可选2GB/4GB/8GB)。
2.1 DDR内存基本信息
通过“free -h”指令读取内存DDR的使用情况;通过/proc/meminfo 文件读取系统中的内存的参数信息。
//------测试工具
free
//---测试指令
free -h
或者
free -m
//---参数解析
-h 参数代表单位为 GByte
-m 参数代表单位为 MByte
total :内存总量
used :被使用的内存量
free :可使用的内存量
//------查看系统内存信息文件
cat /proc/meminfo
//------
user@starfive:~/zmj_ws/5_coremark/coremark$ free -h
total used free shared buff/cache available
Mem: 3.8Gi 500Mi 2.8Gi 5.9Mi 555Mi 3.3Gi
Swap: 0B 0B 0B
user@starfive:~/zmj_ws/5_coremark/coremark$ free -m
total used free shared buff/cache available
Mem: 3891 500 2884 5 555 3391
Swap: 0 0 0
user@starfive:~/zmj_ws/5_coremark/coremark$ cat /proc/meminfo
MemTotal: 3985220 kB
MemFree: 2953620 kB
MemAvailable: 3473068 kB
Buffers: 30840 kB
Cached: 501556 kB
SwapCached: 0 kB
Active: 177500 kB
Inactive: 729168 kB
Active(anon): 4748 kB
Inactive(anon): 375576 kB
Active(file): 172752 kB
Inactive(file): 353592 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 20 kB
Writeback: 0 kB
AnonPages: 374344 kB
Mapped: 174228 kB
Shmem: 6044 kB
KReclaimable: 36704 kB
Slab: 68452 kB
SReclaimable: 36704 kB
SUnreclaim: 31748 kB
KernelStack: 5632 kB
PageTables: 10524 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1992608 kB
Committed_AS: 2967436 kB
VmallocTotal: 67108863 kB
VmallocUsed: 9916 kB
VmallocChunk: 0 kB
Percpu: 480 kB
CmaTotal: 524288 kB
CmaFree: 520128 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
user@starfive:~/zmj_ws/5_coremark/coremark$
2.2 STREAM内存带宽测试
STREAM内存带宽测试
//------使用stream测试:
//---下载
git clone https://gitee.com/spacemit/STREAM.git
//---编译
cd STREAM
make stream_c.exe
//---执行
./stream_c.exe
//------log信息(示例)
user@starfive:~/zmj_ws/5_STREAM$ ./stream_c.exe
-------------------------------------------------------------
STREAM version : 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
The *best* time for each kernel (excluding the first iteration)
will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 4
Number of Threads counted = 4
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 94540 microseconds.
(= 94540 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function Best Rate MB/s Avg time Min time Max time
Copy: 3047.2 0.061636 0.052508 0.079905
Scale: 3056.4 0.065006 0.052349 0.097500
Add: 3838.6 0.070985 0.062523 0.095684
Triad: 3714.4 0.081544 0.064614 0.116189
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------
user@starfive:~/zmj_ws/5_STREAM$
//------各测试项含义
a.Copy-复制操作
从内存单元中读取一个数,并复制到其他内存单元中,两次访问内存操作
b.Scale-乘法操作
从内存单元中读取一个数,与常数相乘,得到的记过存到其他内存单元,两次访问内存操作
c.Add-加法操作
从两个内存单元中分别读取两个数,将其进行加法操作后,得到的结果写入另一个内存单元中,3次访问
内存操作
d.Triad-前面三种的结合
先从内存中读取一个数,与一个常数相乘得到一个乘积,然后从另一个内存单元中读取一个数与刚才乘积
结果相加,得到的结果写入内存。
共计3次访问内存操作。
测试结果一般的规律是Add > Triad > Copy > Scale。一次Add操作需要访问三次内存(两个读操作,一
个写操作),Triad操作也需要三次访问内存, Copy和Scale操作需要两次访问内存。单位操作内,访问内
存次数越多,越能够掩盖访存延迟,带宽越大。
单核Stream测试,影响的因素除了内存控制器能力外,还有Core的ROB、Load/Store对其影响,因此不是
单纯的内存带宽性能测试。
而多核Stream测试,通过多核同时发出大量内存访问请求,能够更加饱和地访问内存,从而测试到内存带宽的
极限性能。
2.3 内存功能压力测试-memtester
内存功能压力测试-memtester需要安装:
//------安装内存功能压力测试工具memtester
sudo apt install memtester -y
或者
sudo apt-get install memtester -y
memtester通过给定测试内存的大小和次数, 可以对系统现有的内存进行压力上的测试。例如指定内存大小 512MB,测试次数为 10,则测试命令为“memtester 512M 10"。
下列以使用 512MB 内存空间,单次测试为例(需要切换到root用户进行测试):
//------测试工具(MYD-YG2LX系统已带)
memtester
//------测试指令
memtester 512M 1
//---指令说明
指定内存大小 512MB,测试次数为 1
//---示例
user@starfive:/home/user# sudo apt install memtester -y
root@starfive:/home/user# sudo su
root@starfive:/home/user# memtester 512M 1
memtester version 4.6.0 (64-bit)
Copyright (C) 2001-2020 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 512MB (536870912 bytes)
got 512MB (536870912 bytes), trying mlock ...locked.
Loop 1/1:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
8-bit Writes : ok
16-bit Writes : ok
Done.
root@starfive:/home/user#
//------end