Xeon Skylake SMP出现意外和无法解释的缓慢(和异常)内存性能
我们一直在测试使用2x Xeon Gold 6154 CPU和Supermicro X11DPH-I主板以及96GB RAM的服务器,发现与仅使用1个CPU(一个插槽为空),类似双CPU的运行相比,内存存在一些非常奇怪的性能问题。 CPU Haswell Xeon E5-2687Wv3(用于该系列测试,但其他Broadwell的性能类似),Broadwell-E i7和Skylake-X i9(用于比较)。 可以预期,具有更快内存的Skylake Xeon处理器在处理各种memcpy功能甚至内存分配(我们在下面的测试中未涵盖,我们找到了一种解决方法)时,其性能将比Haswell更快,但同时安装了两个CPU ,Skylake Xeon的速度几乎是Haswell Xeon的一半,与i7-6800k相比,甚至更低。甚至更奇怪的是,当使用Windows VirtualAllocExNuma分配NUMA节点进行内存分配时,虽然普通内存复制功能预期在远程节点上的性能要比本地节点差,但使用SSE,MMX和AVX寄存器的内存复制功能却执行得很多在远程NUMA节点上的速度比在本地节点上快(什么?)。如上所述,借助Skylake Xeons, 我不确定这是否是主板或CPU上的错误,或者是UPI与QPI的错误,还是以上都不是,但BIOS设置的组合似乎都没有用。在BIOS中禁用NUMA(测试结果中未包括)确实可以提高使用SSE,MMX和AVX寄存器的所有复制功能的性能,但是所有其他普通内存复制功能也会遭受很大的损失。 对于我们的测试程序,我们同时使用内联汇编函数和_mm内在函数进行了测试,除了汇编函数(msvc ++不会针对x64编译asm)之外,我们将Windows 10与Visual Studio 2017一起用于所有其他功能,我们使用mingw / msys的gcc到使用-c -O2标记编译obj文件,该标记包含在msvc ++链接器中。 如果系统使用的是NUMA节点,我们将对每个NUMA节点使用VirtualAllocExNuma测试两个新的用于内存分配的运算符,并对每个内存复制函数进行100个平均16MB的内存缓冲区副本的累积平均值,然后轮换我们在哪个内存分配上在每组测试之间。 所有100个源缓冲区和100个目标缓冲区都是64字节对齐的(为了兼容使用流功能的AVX512),并分别初始化为源缓冲区的增量数据和目标缓冲区的0xff。 在每种配置下,每台计算机上平均的副本数量各不相同,因为某些副本的速度快得多,而另一些配置的速度慢得多。 结果如下: Haswell Xeon E5-2687Wv3具有32GB DDR4-2400(10c / 20t,25 MB的L3缓存)的 Supermicro X10DAi上的1个CPU(1个空插槽)。但是请记住,基准测试通过100对16MB缓冲区循环,因此我们可能没有获得L3缓存命中率。 --------------------------------------------------------------------------- Averaging 7000 copies of 16MB of …