CPU ↔ DRAM(内存总线)的可持续数据传输带宽
最大理论带宽
最大理论带宽(Theoretical Maximum Memory Bandwidth),不需要运行复杂的测试,只需要知道两个核心参数:内存频率和内存通道数。
1. 核心计算公式
内存带宽的计算公式如下:
\[\text{Max Bandwidth (GB/s)} = \frac{\text{Memory Clock (MHz)} \times \text{Bus Width (64-bit)} \times \text{Channels} \times \text{Data Rate (2 for DDR)}}{8 \times 1000}
\]
对于 DDR (Double Data Rate) 内存,我们通常直接使用其“等效频率”(即厂家标称的频率,如 3200 MT/s):
\[\text{Max Bandwidth (GB/s)} = \frac{\text{MT/s} \times 8 \text{ Bytes} \times \text{Channels}}{1000}
\]
注意: 每一条内存插槽的位宽固定为 64-bit(即 8 Bytes)。
2. 在 Linux 中获取硬件参数
你需要确认当前系统运行的内存实际频率和通道数。
第一步:获取内存频率和类型
使用 dmidecode 命令查看硬件详情:
sudo dmidecode -t memory | grep -P "Speed|Type|Part Number"
-- 输出
Error Correction Type: None
Type: DDR5
Type Detail: Synchronous
Speed: 5600 MT/s
Part Number: M323R1GB4DB0-CWMOD
Configured Memory Speed: 4800 MT/s
Type: DDR5
Type Detail: Synchronous
Speed: 5600 MT/s
Part Number: M323R1GB4DB0-CWMOD
Configured Memory Speed: 4800 MT/s
- 查找 Configured Memory Speed(例如:3200 MT/s)。
- 注意不要看 Max Speed,那是硬件支持的上限,要看当前运行的 Configured Speed。
第二步:确认通道数 (Channels)
通过查看插槽填充情况来判断:
sudo dmidecode -t memory | grep "Size" | grep -v "No Module Installed"
--输出
Size: 8 GB
Non-Volatile Size: None
Volatile Size: 8 GB
Cache Size: None
Logical Size: None
Size: 8 GB
Non-Volatile Size: None
Volatile Size: 8 GB
Cache Size: None
Logical Size: None
- 如果有 2 条相同容量的内存,且主板支持双通道,则通道数为 2。
- 如果是服务器级别(如 EPYC 或 Xeon),可能会有 8 通道。
你是 DDR4 3200MHz 且有 2 根内存,那么你的最大理论带宽就是 \(3200 \times 8 \times 2 / 1000 = 51.2 \text{ GB/s}\)。
3. 快速参考表 (以常用配置为例)
| 内存类型 | 等效频率 (MT/s) | 通道数 (Channels) | 理论最大带宽 (GB/s) |
|---|---|---|---|
| DDR4 | 2400 | 1 (单通道) | 19.2 |
| DDR4 | 3200 | 2 (双通道) | 51.2 |
| DDR4 | 3200 | 8 (服务器/EPYC) | 204.8 |
| DDR5 | 4800 | 2 (双通道) | 76.8 |
| DDR5 | 6000 | 2 (双通道) | 96.0 |
使用 STREAM 验证实际带宽 (Benchmark)
1 理论内存带宽计算
例如本机配置:
- Memory type: DDR5
- Configured speed: 4800 MT/s
- Bus width: 64 bit = 8 Bytes
- Channels: 2
理论带宽 = 76.8 GB/s
STREAM benchmark
STREAM 是 HPC 领域最常用的 内存带宽 benchmark,通过四个 kernel 测试持续内存访问带宽:
| Kernel | 操作 |
|---|---|
| Copy | a[i] = b[i] |
| Scale | a[i] = scalar * b[i] |
| Add | a[i] = b[i] + c[i] |
| Triad | a[i] = b[i] + scalar * c[i] |
其中 Triad 一般作为最终带宽指标。
下载 STREAM
git clone https://github.com/jeffhammond/STREAM.git
cd STREAM
为了避免缓存影响,需要增大数组规模,使测试数据远大于 CPU cache。
示例编译:
gcc -O3 -march=native -fopenmp -mcmodel=large \
-DSTREAM_ARRAY_SIZE=200000000 \
stream.c -o stream
参数说明:
| 参数 | 作用 |
|---|---|
| -O3 | 编译优化 |
| -march=native | 使用 CPU SIMD 指令 |
| -fopenmp | 多线程 |
| -mcmodel=large | 允许 >2GB 全局数组 |
| -STREAM_ARRAY_SIZE | 控制数组规模 |
数据规模
配置:
STREAM_ARRAY_SIZE = 200000000
内存占用:
200M elements × 8 bytes = 1.6 GB / array
3 arrays ≈ 4.5 GB
该规模已经 远大于 CPU cache,可以测试真实 DRAM 带宽。
运行 benchmark
设置线程数(通常等于 CPU 线程数):
export OMP_NUM_THREADS=10
./stream
测试结果示例
precision of your system timer.
-------------------------------------------------------------
Function Best Rate MB/s Avg time Min time Max time
Copy: 56158.0 0.057857 0.056982 0.058437
Scale: 48954.4 0.067805 0.065367 0.069320
Add: 51523.8 0.095119 0.093161 0.098945
Triad: 51388.6 0.094508 0.093406 0.096107
-------------------------------------------------------------
换算:
Triad ≈ 51.4 GB/s
未经作者同意请勿转载
本文来自博客园作者:aixueforever,原文链接:https://chuna2.787528.xyz/aslanvon/p/19695968

浙公网安备 33010602011771号