Performance NT内核是否没有使用多内存通道体系结构?

Performance NT内核是否没有使用多内存通道体系结构?,performance,memory,ram,cpu-architecture,windows-kernel,Performance,Memory,Ram,Cpu Architecture,Windows Kernel,我一直在阅读测试具有多内存通道体系结构的系统好处的基准测试。大多数基准测试的一般结论是,与具有较少通道的系统相比,具有较多内存通道的系统的性能优势可以忽略不计 然而,我在任何地方都找不到解释为什么会出现这种情况的方法,只有基准测试结果表明这是真实世界中获得的性能 理论上,系统内存通道的每增加一倍,内存访问带宽就会增加一倍,因此理论上应该有性能增益,但在实际应用中,增益可以忽略不计。为什么? 我的假设是,当NT内核分配物理内存时,它不会在内存通道上均匀地干扰分配。如果一个进程的所有虚拟内存都映射到

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

然而,我在任何地方都找不到解释为什么会出现这种情况的方法,只有基准测试结果表明这是真实世界中获得的性能

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

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

自然地,一个进程被分配虚拟内存,内核分配物理内存页,那么这种微不足道的性能增益是不是NT内核没有在可用通道上分配分配的错误呢

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

将其视为一个层次结构,如“CPU一级缓存二级缓存三级缓存RAM交换空间”。RAM带宽只在三级缓存不够大时才起作用(交换空间带宽只在RAM不够大时起作用,以及…)

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

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

它不是那样工作的。CPU主要只处理整个缓存线(例如64字节块);对于一个通道,整个缓存线来自一个通道;对于两个通道,缓存线的一半来自一个通道,另一半来自另一个通道。几乎没有任何软件可以做任何改变。NT内核只适用于整个页面(例如4个KiB块),因此内核所做的任何事情都不太重要(直到您开始考虑NUMA优化,这是一件完全不同的事情)

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

将其视为一个层次结构,如“CPU一级缓存二级缓存三级缓存RAM交换空间”。RAM带宽只在三级缓存不够大时才起作用(交换空间带宽只在RAM不够大时起作用,以及…)

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

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

它不是那样工作的。CPU主要只处理整个缓存线(例如64字节块);对于一个通道,整个缓存线来自一个通道;对于两个通道,缓存线的一半来自一个通道,另一半来自另一个通道。几乎没有任何软件可以做任何改变。NT内核只适用于整个页面(例如4 KiB块),因此内核所做的任何事情都不太重要(除非您开始考虑NUMA优化,这是一件完全不同的事情)。

相关:两个内存控制器足以满足单线程内存带宽的要求。只有当您有多个线程/进程,而这些线程/进程都在缓存中大量丢失时,您才能从大型Xeon中的额外内存控制器中获益

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

如果四核上的单线程程序在很多时候都在DRAM带宽上受到限制,那么从两个DDR4通道减少到一个DDR4通道甚至可能会对其造成伤害,但性能调整的一个重要部分是优化数据重用,以便至少获得三级缓存命中率

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

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

如果单个DRAM通道足以满足硬件预取请求,即代码实际接触新内存的速度/速度,那么内存带宽不会有任何可测量的放缓。(当然,这并不总是可能的,有时你会在一个大数组上循环,做的工作不多,甚至只是复制它,但如果这只构成了一个小的f