我有一块华硕 WS-Pro-X570-ACE 主板,并根据用户手册中有关启用双通道第 1.4 节(第 1-12 页)的内容,将两个完全相同的内存条(Hynix,16GB,DDR4,2R*8)插入到它的 A2 和 B2 插槽上。
但是当我在 debian12 中运行时sysbench memory run
,我得到的结果与在单通道模式下运行时的结果相同。
像这样:
sysbench 1.0.20(使用系统LuaJIT 2.1.0-beta3)
使用以下选项运行测试:线程数:1 从当前时间初始化随机数生成器
使用以下选项运行内存速度测试:块大小:1KiB 总大小:102400MiB 操作:写入范围:全局
初始化工作线程...
讨论已开始!
总操作数:77184144(每秒 7718000.79 次)
已传输 75375.14 MiB(7537.11 MiB/秒)
总体统计:总时间:10.0000s 总事件数:77184144
延迟(毫秒):最小值:0.00 平均值:0.00 最大值:0.01 第 95 百分位数:0.00 总计:3647.56
线程公平性:事件(平均值/标准差):77184144.0000/0.00 执行时间(平均值/标准差):3.6476/0.00
我是否遗漏了什么巧妙的方法?
双通道 DDR4 @ 3200 MT/s 系统的理论峰值内存带宽为 64b x 2 x 3.2G / 8 = 51.2 GB/s,但您的基准测试仅显示 7.5 GB/s,这是理论峰值的 10%。因此,基准测试本身存在缺陷。您一开始就没有达到峰值系统内存带宽的饱和,因此没有差异也就不足为奇了。
良好的内存基准测试应该是多线程的,因为单线程应用程序通常无法饱和整个带宽(矢量化可以有所帮助,但只能达到一定程度)。此外,程序的内部循环最好用低级语言(如汇编语言)或经过编译器优化的 FORTRAN/C 编写,这样您就可以对 CPU 及其内存子系统施加最大的压力。有几种知名且符合行业标准的内存基准测试可用,包括 John D. McCalpin 的 STREAM 基准测试和
likwid-bench
LIKWID 工具中包含的内置内存基准测试。这两种工具都广泛应用于科学和高性能计算领域,并被用于许多学术研究论文中。因此,请考虑使用 STREAM 或
likwid-bench
正确测量系统的内存带宽。溪流
STREAM 是由 John D. McCalpin 博士编写的一段小型 C/FORTRAN 代码,自 1990 年代以来一直用于基准超级计算机,如今由于其简单性,它仍然是行业标准。
要运行 STREAM 测试,请从https://github.com/jeffhammond/STREAM (这是一个非官方镜像)获取源代码。
使用以下命令手动编译 C 代码(不要使用
Makefile
):该宏
STREAM_ARRAY_SIZE
控制分配的数组大小。然后运行:
OpenMP默认会在所有CPU核上运行STREAM,最终可以得到如下结果:
由于 GCC 缺乏非临时存储优化,在 Scale、Add 和 Triad 测试中,CPU 执行 Write-Allocate,这会在未测量的内存子系统中产生额外的开销。要正确解释此结果,您应该将 Scale 的结果乘以 1.5,将 Add 和 Triad 的结果乘以 1.33。这样做的原因涉及对 CPU 缓存的理解,我已经在另一个答案流内存带宽基准测试的预期结果中对此进行了解释。
例如,在这种情况下:
如您所见,在我的计算机上,在所有这些测试中,我在 STREAM 基准测试中获得了大约 40 GB/s 的内存带宽。这是可以预料的,因为可用内存带宽通常约为理论内存带宽的 70%-80%。请注意,按照惯例,内存带宽始终以 GB/s 为单位报告,而不是 GiB/s。
运行系统单通道内存将使 STREAM 速度减半。请尝试自己做一下这个实验:移除一个 DIMM 通道,STREAM 结果将减少 50。重新添加 DIMM 通道,结果又会上升。
利克维德
STREAM 是一款经典产品,因此运行它与其他人的基准测试进行比较很有用。但它容易出错。在台式机上它可以没问题(只要您了解非临时存储的有效性)。但在服务器上,存在许多与 NUMA、编译器和 CPU 的写入分配行为相关的陷阱 - 这些陷阱不会自动处理,并且可能会产生误导性的结果。
因此,为了测试 CPU 内存带宽,我更喜欢使用 LIKWID。Likwid 是 HPC 应用程序性能调优的瑞士军刀。它的主要用途是从低级硬件性能计数器收集统计数据,以了解和优化代码的性能特征。但它还包括一个名为的微型基准测试工具
likwid-bench
。首先,按照 LIKWID 官方手册运行 。然后,一个名为 的工具
make
就会出现。它可以自动启动基准测试程序的多个实例,并将每个实例的进程和内存固定到其对应的 NUMA 节点。它还提供了许多预先编写的基准测试内核(包括 STREAM Triad 基准测试的等效项),这些内核以手写汇编语言编写,可实现准确一致的结果,例如:make install
likwid-bench
likwid-bench
下面是使用 STREAM Triad 基准测量内存带宽的示例
likwid-bench
,使用 AVX、FMA 和非临时存储,使用 4 个实例,每个实例都最佳地固定到 NUMA 节点。要使用 STREAM Triad 测试对单台台式计算机进行基准测试,请运行:
该参数
M0:1GB
表示在机器的第一个 NUMA 节点上运行测试。由于台式计算机只有一个 NUMA 节点,因此这已经足够了。对于服务器,请使用与 CPU 相同的 NUMA 节点数。由于汇编代码已经使用非临时存储进行优化,因此无需手动更正结果
likwid-bench
。likwid-bench
结果应该与手动更正的 STREAM 结果非常相似。作为参考,这是一台双插槽 Intel Xeon E5-2680 v4 机器,每个插槽上都有 4 通道 DDR4 ECC RDIMM @ 2400 MT/s,因此它应该表现得像一台 8 通道机器。BIOS中启用了Cluster-On-Die模式,因此,每个 CPU 被视为两个 NUMA 节点 - CPU 的硅片在物理上被分成 2 个部分,每个部分都有自己的 2 通道内存控制器,通过两个独立的环形总线之间的桥接器互连,每个环形总线都有一半的内核。整个机器有 4 个 NUMA 节点。对于 NUMA 感知应用程序,这提供了最高的内存带宽。
增加线程数
sysbench
?我不熟悉
sysbench
,但它是否允许您使用多个线程运行内存基准测试。如果是这样,请考虑使用与 CPU 核心或硬件 SMT 线程一样多的线程重新进行您自己的测试。