找回密码
 立即注册
首页 业界区 业界 CPU ↔ DRAM(内存总线)的可持续数据传输带宽 ...

CPU ↔ DRAM(内存总线)的可持续数据传输带宽

阜逐忍 11 小时前
最大理论带宽

最大理论带宽(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 命令查看硬件详情:
  1. sudo dmidecode -t memory | grep -P "Speed|Type|Part Number"
  2. -- 输出
  3.         Error Correction Type: None
  4.         Type: DDR5
  5.         Type Detail: Synchronous
  6.         Speed: 5600 MT/s
  7.         Part Number: M323R1GB4DB0-CWMOD
  8.         Configured Memory Speed: 4800 MT/s
  9.         Type: DDR5
  10.         Type Detail: Synchronous
  11.         Speed: 5600 MT/s
  12.         Part Number: M323R1GB4DB0-CWMOD
  13.         Configured Memory Speed: 4800 MT/s
复制代码

  • 查找 Configured Memory Speed(例如:3200 MT/s)。
  • 注意不要看 Max Speed,那是硬件支持的上限,要看当前运行的 Configured Speed
第二步:确认通道数 (Channels)

通过查看插槽填充情况来判断:
  1. sudo dmidecode -t memory | grep "Size" | grep -v "No Module Installed"
  2. --输出
  3.         Size: 8 GB
  4.         Non-Volatile Size: None
  5.         Volatile Size: 8 GB
  6.         Cache Size: None
  7.         Logical Size: None
  8.         Size: 8 GB
  9.         Non-Volatile Size: None
  10.         Volatile Size: 8 GB
  11.         Cache Size: None
  12.         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)DDR424001 (单通道)19.2DDR432002 (双通道)51.2DDR432008 (服务器/EPYC)204.8DDR548002 (双通道)76.8DDR560002 (双通道)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操作Copya = bScalea = scalar * bAdda = b + cTriada = b + scalar * c其中 Triad 一般作为最终带宽指标。
下载 STREAM
  1. git clone https://github.com/jeffhammond/STREAM.git
  2. cd STREAM
复制代码
为了避免缓存影响,需要增大数组规模,使测试数据远大于 CPU cache。
示例编译:
  1. gcc -O3 -march=native -fopenmp -mcmodel=large \
  2. -DSTREAM_ARRAY_SIZE=200000000 \
  3. stream.c -o stream
复制代码
参数说明:
参数作用-O3编译优化-march=native使用 CPU SIMD 指令-fopenmp多线程-mcmodel=large允许 >2GB 全局数组-STREAM_ARRAY_SIZE控制数组规模数据规模

配置:
  1. STREAM_ARRAY_SIZE = 200000000
复制代码
内存占用:
  1. 200M elements × 8 bytes = 1.6 GB / array
  2. 3 arrays ≈ 4.5 GB
复制代码
该规模已经 远大于 CPU cache,可以测试真实 DRAM 带宽。
运行 benchmark

设置线程数(通常等于 CPU 线程数):
  1. export OMP_NUM_THREADS=10
  2. ./stream
复制代码
测试结果示例
  1. precision of your system timer.
  2. -------------------------------------------------------------
  3. Function    Best Rate MB/s  Avg time     Min time     Max time
  4. Copy:           56158.0     0.057857     0.056982     0.058437
  5. Scale:          48954.4     0.067805     0.065367     0.069320
  6. Add:            51523.8     0.095119     0.093161     0.098945
  7. Triad:          51388.6     0.094508     0.093406     0.096107
  8. -------------------------------------------------------------
复制代码
换算:
  1. Triad ≈ 51.4 GB/s
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册