纯 C++ 开发的 Telegram Bot 框架

渡蔚冒退最大理论带宽

最大理论带宽(Theoretical Maximum Memory Bandwidth),不需要运行复杂的测试,只需要知道两个核心参数:内存频率和内存通道数。

  1. 核心计算公式

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

Max 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

×

Channels

1000

注意: 每一条内存插槽的位宽固定为 64-bit(即 8 Bytes)。

  1. 在 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/s

  1. 快速参考表 (以常用配置为例)

内存类型 等效频率 (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