【问题标题】:Does the NT Kernel not utilise Multiple Memory Channel Architecture?NT 内核不使用多内存通道架构吗?
【发布时间】:2019-07-06 10:48:45
【问题描述】:

我一直在阅读测试具有多内存通道架构的系统的优势的基准。大多数这些基准测试的一般结论是,与具有较少通道的系统相比,具有更多内存通道的系统的性能优势可以忽略不计。

但是我没有找到解释为什么会出现这种情况,只是基准测试结果表明这是在现实世界中获得的性能。

理论上,系统内存通道每增加一倍,内存访问的带宽就会增加一倍,因此理论上应该有性能提升,但在实际应用中,收益可以忽略不计。为什么?

我的假设是,当 NT 内核分配物理内存时,它不会在内存通道上均匀地干扰分配。如果一个进程的所有虚拟内存都映射到 MMC 系统中的单个内存通道,那么该进程将实际上只能获得拥有单个内存通道供其支配的性能。这是现实世界性能提升微不足道的原因吗?

自然会为进程分配虚拟内存,而内核分配物理内存页面,那么这种微不足道的性能增益是否是 NT 内核没有在可用通道上分配分配的错误?

【问题讨论】:

标签: performance memory ram cpu-architecture windows-kernel


【解决方案1】:

理论上,系统内存通道每增加一倍,内存访问的带宽就会增加一倍,因此理论上应该有性能提升,但在实际应用中,收益可以忽略不计。为什么?

将其视为一个层次结构,例如“CPU L1 缓存 L2 缓存 L3 缓存 RAM 交换空间”。 RAM 带宽仅在 L3 缓存不够大时才重要(交换空间带宽仅在 RAM 不够大时才重要,并且...)。

对于大多数(不是所有)现实世界的应用程序,缓存足够大,因此 RAM 带宽并不重要,(多通道的)收益可以忽略不计。

我的假设是,当 NT 内核分配物理内存时,它不会在内存通道上均匀地干扰分配。

它不是那样工作的。 CPU 大多只适用于整个高速缓存行(例如 64 字节块);并且对于一个通道,整个缓存行来自一个通道;并且有 2 个通道,缓存行的一半来自一个通道,另一半来自不同的通道。几乎没有任何软件可以做的事情会产生任何影响。 NT 内核仅适用于整个页面(例如 4 KiB 片段),因此无论内核做什么都不太重要(直到您开始考虑 NUMA 优化,这是完全不同的事情)。

【讨论】:

  • 我认为并不是大多数现实世界的应用程序都不受带宽限制,而是某些类别的工作负载比其他工作负载更受内存带宽限制。例如,众所周知,HPC 工作负载(例如大量 SPEC CPU 基准测试)对内存带宽非常敏感。我们不知道 OP 正在谈论什么类型的工作负载。跨通道交错是可配置的,操作系统分配物理内存的方式会对性能产生重大影响,但可能会增加能耗。
  • 我搜索了“测试具有多内存通道架构的系统的优势的基准” - 前 2 个结果主要针对游戏玩家。 HPC 是一个更为复杂的领域。
  • @Brendan 是的,作者似乎关心游戏,尽管一些基准测试模拟了图像处理。我的好奇心与成像有关。我想到的场景是对大量(>100)图像文件(每个 RAW >30MB)进行批量图像处理。可能有 8 个内核和 16 个线程,每个线程执行一个任务,例如通过插值放大图像。每个图像文件都大于整个处理器可用的总缓存。您是说从统计上来说,内核需要同时从 RAM 加载的可能性不大,因此额外带宽的性能增益可以忽略不计?
  • @Brendan 感谢您的回复,我想我的困惑正在消除。是不是图像的并行处理可能不是多幅图像的并行处理,而是单幅图像的并行处理,以充分利用缓存,然后串行处理图像?如果每个核心并行处理不同的图像,那么缓存的使用肯定会非常低效。
【解决方案2】:

相关:Why is Skylake so much better than Broadwell-E for single-threaded memory throughput? 两个内存控制器足以满足单线程内存带宽。只有当您有多个线程/进程都在缓存中丢失 lot 时,您才会开始受益于大型 Xeon 中的额外内存控制器。

(例如,您在 cmets 中对不同图像并行运行许多独立图像处理任务的示例可能会这样做,具体取决于任务。)

从两个到一个 DDR4 通道甚至可能会伤害四核上的单线程程序如果它在很多时候都受到 DRAM 带宽的瓶颈,但调整的一个重要部分性能是为了优化数据重用,以便您至少获得 L3 缓存命中。

矩阵乘法是一个经典的例子:而不是在整个矩阵的行/列上循环 N^2 次(太大而无法放入缓存)(一行 x 列的点积为每个输出元素),您将工作分解为“图块”并计算部分结果,因此您在 L1d 或 L2 缓存中保持热的矩阵图块上反复循环。 (并且您希望 FP ALU 吞吐量成为瓶颈,运行 FMA 指令,而不是内存,因为 matmul 对方阵的 N^2 个元素进行 O(N^3) 乘加运算。)这些优化称为“循环平铺” " 或 "缓存阻塞"。

如此优化的代码涉及大量内存,通常可以完成足够的工作,因为它的循环在大多数情况下实际上不会成为 DRAM 带宽的瓶颈(L3 缓存未命中)。

如果 DRAM 的单个通道足以满足硬件预取请求,即代码实际接触新内存的速度/速度有多慢,那么内存带宽不会出现任何可测量的减速。 (当然这并不总是可能的,有时你会循环一个大数组而不做太多工作,甚至只是复制它,但如果它只占总运行时间的一小部分,那么它仍然不重要。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多