【VisionFive 2:集成3D GPU RISC-V单板计算机】+ CPU/DDR功能测试
赛昉科技的“昉·星光 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//---指令lscpucat /proc/cpuinfo//---结果指令集:RSIC-V 64bit4核CPU:编号0~3//------查看CPU频率://---指令sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_cur_freqsudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_max_freqsudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_min_freq//---结果工作频率:312.5MHz~1.5GHz当前频率:750MHz//------log信息(示例)user@starfive:~/zmj_ws/5_coremark/coremark$ lscpuArchitecture: riscv64 Byte Order: Little EndianCPU(s): 4 On-line CPU(s) list: 0-3user@starfive:~/zmj_ws/5_coremark/coremark$ cat /proc/cpuinfoprocessor : 0hart : 1isa : rv64imafdcmmu : sv39isa-ext :uarch : sifive,u74-mc processor : 1hart : 2isa : rv64imafdcmmu : sv39isa-ext : uarch : sifive,u74-mcprocessor : 2hart : 3isa : rv64imafdcmmu : sv39isa-ext : uarch : sifive,u74-mc processor : 3hart : 4isa : rv64imafdcmmu : sv39isa-ext : uarch : sifive,u74-mc user@starfive:~/zmj_ws/5_coremark/coremark$ sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_cur_freq750000user@starfive:~/zmj_ws/5_coremark/coremark$ sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_max_freq1500000user@starfive:~/zmj_ws/5_coremark/coremark$ sudo cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_min_freq312500user@starfive:~/zmj_ws/5_coremark/coremark$ hostnamectl Static hostname: starfive Icon name: computer Machine ID: b0c15c2d3a1843d486fe35272f9f72ef Boot ID: e9058acac80f4749a9d9c875710167baOperating System: Debian GNU/Linux bookworm/sid Kernel: Linux 5.15.0-starfive Architecture: riscv64user@starfive:~/zmj_ws/5_coremark/coremark$
1.2 CoreMark性能测试
1.2.1 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源码获取
EEMBC 在将 CoreMark 源码托管在 GitHub 上可以访问http://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.exe2K performance run parameters for coremark.CoreMark Size : 666Total ticks : 22792Total time (secs): 22.792000Iterations/Sec : 4826.254826Iterations : 110000Compiler version : GCC12.2.0Compiler flags : -O2 -DPERFORMANCE_RUN=1 -lrtMemory 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 : 0x33ffCorrect operation validated. See README.md for run and reporting rules.CoreMark 1.0 : 4826.254826 / GCC12.2.0 -O2 -DPERFORMANCE_RUN=1 -lrt / Heapuser@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 参数代表单位为 MBytetotal :内存总量used :被使用的内存量free :可使用的内存量//------查看系统内存信息文件cat /proc/meminfo//------user@starfive:~/zmj_ws/5_coremark/coremark$ free -h total used free shared buff/cache availableMem: 3.8Gi 500Mi 2.8Gi 5.9Mi 555Mi 3.3GiSwap: 0B 0B 0Buser@starfive:~/zmj_ws/5_coremark/coremark$ free -m total used free shared buff/cache availableMem: 3891 500 2884 5 555 3391Swap: 0 0 0user@starfive:~/zmj_ws/5_coremark/coremark$ cat /proc/meminfoMemTotal: 3985220 kBMemFree: 2953620 kBMemAvailable: 3473068 kBBuffers: 30840 kBCached: 501556 kBSwapCached: 0 kBActive: 177500 kBInactive: 729168 kBActive(anon): 4748 kBInactive(anon): 375576 kBActive(file): 172752 kBInactive(file): 353592 kBUnevictable: 0 kBMlocked: 0 kBSwapTotal: 0 kBSwapFree: 0 kBDirty: 20 kBWriteback: 0 kBAnonPages: 374344 kBMapped: 174228 kBShmem: 6044 kBKReclaimable: 36704 kBSlab: 68452 kBSReclaimable: 36704 kBSUnreclaim: 31748 kBKernelStack: 5632 kBPageTables: 10524 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 1992608 kBCommitted_AS: 2967436 kBVmallocTotal: 67108863 kBVmallocUsed: 9916 kBVmallocChunk: 0 kBPercpu: 480 kBCmaTotal: 524288 kBCmaFree: 520128 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kBHugetlb: 0 kBuser@starfive:~/zmj_ws/5_coremark/coremark$
2.2 STREAM内存带宽测试
STREAM内存带宽测试
//------使用stream测试://---下载git clone https://gitee.com/spacemit/STREAM.git//---编译cd STREAMmake 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需要安装:
//------安装内存功能压力测试工具memtestersudo 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 -yroot@starfive:/home/user# sudo suroot@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#