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