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

1. 核心计算公式

内存带宽的计算公式如下:

Max Bandwidth (GB/s)=Memory Clock (MHz)×Bus Width (64-bit)×Channels×Data Rate (2 for DDR)8×1000Max Bandwidth (GB/s)=Memory Clock (MHz)×Bus Width (64-bit)×Channels×Data Rate (2 for DDR)8×1000

对于 DDR (Double Data Rate) 内存,我们通常直接使用其"等效频率"(即厂家标称的频率,如 3200 MT/s):

Max Bandwidth (GB/s)=MT/s×8 Bytes×Channels1000Max Bandwidth (GB/s)=MT/s×8 Bytes×Channels1000

注意: 每一条内存插槽的位宽固定为 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×8×2/1000=51.2 GB/s3200×8×2/1000=51.2 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
相关推荐
Android系统攻城狮几秒前
Linux PipeWire深度解析之pw_context_add_spa_lib调用流程与实战(二十九)
linux·运维·服务器·音频进阶·pipewire音频进阶
Dovis(誓平步青云)16 分钟前
《如何在CentOS 7中添加Plex官方软件源:解决文件磁盘难管理难题》
linux·运维·服务器·后端·生成对抗网络·centos
草莓熊Lotso27 分钟前
【Linux网络】深入理解Linux IO多路复用:select服务器完善、内核原理与poll实战
linux·运维·服务器·c语言·网络·c++
RuoyiOffice28 分钟前
超级个体接私活必看:后端+前端+移动端三端一体企业管理系统怎么选(2026)
java·spring boot·vue·uniapp·全栈·企业管理·接私活
●VON33 分钟前
鸿蒙 PC Markdown 编辑器 Alpha 评审:如何用退出条件判断阶段完成
网络·安全·华为·编辑器·harmonyos·鸿蒙
java1234_小锋1 小时前
【免费】基于Spark实时电商用户行为分析与预测(Java版本+可视化大屏+Kafka+SpringBoot+Vue3) 锋哥原创出品,必属精品
java·spark·kafka·实时电商用户行为分析与预测系统
网安老伯1 小时前
网络安全基础要点知识介绍(非常详细),零基础入门到精通,看这一篇就够了
运维·前端·网络协议·web安全·网络安全·职场和发展
迷茫中的自我1 小时前
GitHub Actions自动化运维实战:从CI/CD到云原生部署
运维·自动化·github
keyipatience1 小时前
日志和线程池
java·开发语言
XH华1 小时前
Linux系统第二章:常见的Linux指令(上)
linux·运维·服务器