【VisionFive 2:集成3D GPU RISC-V单板计算机】+ CPU/DDR功能测试

发布时间:2023-09-09

赛昉科技的“昉·星光 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#