DDR内存基础知识和带宽测试
一、DDR基础知识
1. 几个频率
(1) 核心频率:真实运行频率。
(2) 倍增系数:DDR通过数据预取技术放大速率,每代ddr倍率是固定的,ddr=2, ddr2=4, ddr3=8, ddr4=8, ddr5=16
(3) 有效频率;厂商标注的频率,可以理解为数据传输速率。厂商也想逐步淡化其它频率的概念,只让我们记住有效频率。其实有效频率就是核心频率*倍增系数得来的,在理想情况下能代表我们内存数据传输频率。
(4) IO频率:又叫时钟频率,它是有效频率的一半。
2. 厂商标注信息:DDR5-6400
这个6400就是有效频率,单位是MT/s(Million Transfer)。
3. 内存通道
若是把内存传输比作行车的道路,那么道路的宽度自然很重要,当前民用级别的设备大都支持双通道,DDR很好理解,单个通道64Bit,双通道乘以2即可。而DDR5有所谓的单条即可支持双通道的技术,但是这个双通道
并没有比DDR4的位宽更大,因为单个通道仅是32Bit,如果你插入2条DDR5组成双通道,将会是4*32Bit,这实际上是和DDR4的总位宽是一样的。
4. 传输带宽
传输带宽 = 有效频率 * 通道位宽 / 8 //通道位宽单位是Bit,转换成Byte需要除以8
小编DDR5-6400双通道LPDDR5的传输带宽 6400 * 4*32 / 8 = 96GB/s
5. 根据DDR频率计算带宽
传输带宽 = 2 * DDR频率 * 通道位宽 / 8 //乘以2是因为上升沿和下降沿都传输数据
二、带宽测试
- mbw是一个开源的用来测内存带宽的工具,代码网址:https://github.com/raas/mbw
编译执行,只提取其中的mbw.c文件,在 frameworks/native/cmds 下创建mbw目录,如下实现Android.bp,执行make mbw命令进行编译。
Android.bp:
cc_binary {
name: "mbw",
srcs: ["mbw.c"],
cflags: [
"-Wall",
"-Werror",
],
shared_libs: [
"libbase",
],
}
使用方法:
/data/local/tmp # ./mbw -h
mbw memory benchmark v1.5, https://github.com/raas/mbw
Usage: mbw [options] array_size_in_MiB
Options:
-n: number of runs per test (0 to run forever)
-a: Don't display average
-t0: memcpy test
-t1: dumb (b[i]=a[i] style) test
-t2: memcpy test with fixed block size
-b <size>: block size in bytes for -t2 (default: 262144)
-q: quiet (print statistics only)
(will then use two arrays, watch out for swapping)
'Bandwidth' is amount of data copied over the time this operation took.
The default is to run all tests available.
-n0: 0是无限执行t0-t2中的一项。
一共有三种测试模式,分别对应t0 t1 t2,默认参数下,三种模式各执行10次,并打印出10次的平均值。其中t0对应的是memcpy(),一次性拷贝通过命令行参数指定的内存块的大小,单位MB。t1对应的是b[i]=a[i]这种逐字节拷贝的格式。t2对应的是每次memcpy()指定大小内存块,可以-b指定每次拷贝的大小,不指定的话默认是256KB。
执行 ./mbw 512 即可测试了。
- 使用举例
先stop减少干扰,然后执行 ./mbw -n0 -t2 -b32 512 让其恒运行,然后qnx侧执行 ./sysprofiler_app --ddr,看 DDR DDR_BW_TOTAL(MB/s) 这一列,它的值将近是mbw的两倍(拷贝率包括读一次和写一次).
sysprofiler_app 可以测试ddr实时带宽
mbw 不能测试实时带宽,只能测试最大ddr带宽
注:跑8个-b256的看起来测到的结果最大。
二、ARM_BenchMark 工具包
除此之外,还有一个类似的工具,叫 bw_mem,保存在 ARM_BenchMark 工具包中:
ARM_BenchMark: https://github.com/tonyho/ARM_BenchMark/tree/master/lmbench/bin/arm-linux
lmbench: https://github.com/foss-for-synopsys-dwc-arc-processors/lmbench/tree/master/src //上面工具包中已包含
~/tmp/ARM_BenchMark$ ls
Bench-bin dhrystone-src docs fhourstones Linpack lmbench pi_css5_src README.md ReadMe.txt whetstone
~/tmp/ARM_BenchMark$ ls Bench-bin/ //可执行文件
dhrystone linpack pi_css5 SearchGame whetston
~/tmp/ARM_BenchMark$ ls lmbench/bin/arm-linux/ //可执行文件
bw_file_rd bw_unix hello lat_fcntl lat_fs_open_close lat_ops lat_rand lat_syscall lat_usleep loop_o par_ops
bw_mem cache lat_cmd lat_fifo lat_fs_write_truncate lat_pagefault lat_rpc lat_tcp line memsize stream
bw_mmap_rd disk lat_connect lat_fs lat_http lat_pipe lat_select lat_udp lmbench mhz timing_o
bw_pipe enough lat_ctx lat_fs_chown lat_mem_rd lat_pmake lat_sem lat_unix lmdd msleep tlb
bw_tcp flushdisk lat_dram_page lat_fs_create_unlink lat_mmap lat_proc lat_sig lat_unix_connect lmhttp par_mem
- Dhrystone:整数运算、字符串拷贝测试。
- Whetstone:浮点数运算测试。测量浮点数运算的速度和效率。它使用了许多C函数,包括sin、cos、sqrt、exp和log等浮点数和整数数学运算,数组访问、条件分支和过程调用。此测试同时测量整数和浮点数算术。