现在的CPU性能很大程度上取决于缓存子系统,有些应用也非常依赖内存子系统,在这方面可以通过LMBench来评估缓存和内存的延迟。设置的数据为"Random load latency stride=16 Bytes(随机负载延迟幅度= 16字节)" 结果如下:
缓存测试
有人形容AMD的Infinty Fabric将两个CCX封装一个Die上,而在一个MCM中四个不同的Zeppelin Die相互连接。对于Naples来说,将两个CCX封装在一个 Die上肯定不是最佳选择。访问本地"嵌在CCX内的"8MB 3级缓存延迟非常低。但是一旦核心需要访问另一个3级缓存块时,即使在同一个Die上,Unloaded延迟也会非常糟糕。这只比访问内存的延迟好一点,所有目前推出的CPU在访问内存的进程都有很高延迟。信号需要从内存控制器到内存总线,而DDR4-2666内的内存矩阵只运行在333MHz频率上(因此DDR4的CAS延迟非常高),所以令人惊讶的是on-chip fabric访问SRAM需要这么多周期。
这对最终用户意味着什么呢?64MB的3级缓存在规格表上并不真的存在,实际上即使是在单一的Zeppelin Die上的16MB的3级缓存也是由两个8MB的3级缓存组成。在MCM上没有真正单一且统一的3级缓存,而是8个独立的8MB三级缓存。
对于占用空间适用于8MB 3级缓存的应用来说表现很好,像是虚拟机(JVM,虚拟机只依赖于一个)还有HPC/大数据应用并行运行在不同的数据块内(比如map/reduce中的map),然而这样的设计对于那些需要"核心"访问一些大得数据池的应用来说肯定会有损害,比如在数据库应用和大数据应用的"Shuffle Phase"操作。
内存子系统测试
为了再次确认延迟测试并更深入的了解各自的架构,因此AnandTech使用了开源测试软件TinyMemBench,源代码是由x86的GCC 5.4编译,优化级别设置为"O3"。TinyMemBench的操作手册对于测试有个很好的解释:
随机内存访问不同大小缓存的平均时间会被检测,越大的缓存对TLB,一级二级缓存丢失和DRAM访问的的相对贡献越大。所有的数字代表额外的时间,需要增加一级缓存的延迟(4个周期)。
通过测试双随机读取,可以看到内存系统是如何成功应对多个读取需求的。
近几年来,CPU的三级缓存的大小一直在稳步增加。Xeon E5 v1有20MB,v3升到45MB,v4的"Broadwell EP"进一步增加到55MB,但是越大的缓存造成了越大的延迟。从Sandy Bridge-EP到Broadwell-EP,三级缓存的延迟翻了一倍。所以难怪这次Skylake把二级缓存增大并用了更快且更小的三级缓存。这让512KB的测试中二级缓存的延迟降低了4倍。
AMD的unloaded延迟在8MB以下的测试中表现出非常强的竞争力,相对以前的AMD服务器CPU来说是一个巨大的飞跃。但不幸的是在8MB以上的表现相比Broadwell核心访问内存的延迟更加糟糕。而在缓慢的三级缓存访问测试中,AMD的内存访问速度依然是最慢的。Unloaded延迟的重要性当然不应该被过分夸大,不过对于指针追踪和其他对延迟比较敏感的应用来说依然是个坏消息。