DDR記憶體基礎知識和頻寬測試

yooooooo發表於2024-11-16

一、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等浮點數和整數數學運算,陣列訪問、條件分支和過程呼叫。此測試同時測量整數和浮點數算術。

相關文章