Fork me on GitHub

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是因为上升沿和下降沿都传输数据

二、带宽测试

  1. 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 即可测试了。

  1. 使用举例

先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
  1. Dhrystone:整数运算、字符串拷贝测试。
  2. Whetstone:浮点数运算测试。测量浮点数运算的速度和效率。它使用了许多C函数,包括sin、cos、sqrt、exp和log等浮点数和整数数学运算,数组访问、条件分支和过程调用。此测试同时测量整数和浮点数算术。
posted @ 2024-11-16 10:18  yooooooo  阅读(27)  评论(0编辑  收藏  举报