Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 对于一个简单的基准测试,是什么导致了不同Zen 1处理器之间的巨大性能差异?_Performance_Caching_Cpu Architecture_Cpu Cache_Amd Processor - Fatal编程技术网

Performance 对于一个简单的基准测试,是什么导致了不同Zen 1处理器之间的巨大性能差异?

Performance 对于一个简单的基准测试,是什么导致了不同Zen 1处理器之间的巨大性能差异?,performance,caching,cpu-architecture,cpu-cache,amd-processor,Performance,Caching,Cpu Architecture,Cpu Cache,Amd Processor,我正在调查三个不同Zen 1处理器之间一个非常简单的基准测试的性能差异,并且我观察到Threadripper和Epyc处理器之间的每周期指令数和二级缓存未命中率存在巨大差异 问题: 在Epyc处理器上,当工作集大小大于最后一级缓存(LLC)时,每周期指令数(IPC)要低得多 为什么同一代Epyc和Threadripper处理器的性能会如此不同 基准 旧套件中的treeadd基准。源代码作为LLVM测试套件的一部分提供 基准递归地创建一个包含2^N-1个节点的完整二叉树,其中N是输入,并执行10

我正在调查三个不同Zen 1处理器之间一个非常简单的基准测试的性能差异,并且我观察到Threadripper和Epyc处理器之间的每周期指令数和二级缓存未命中率存在巨大差异

问题: 在Epyc处理器上,当工作集大小大于最后一级缓存(LLC)时,每周期指令数(IPC)要低得多

为什么同一代Epyc和Threadripper处理器的性能会如此不同

基准

旧套件中的
treeadd
基准。源代码作为LLVM测试套件的一部分提供

基准递归地创建一个包含2^N-1个节点的完整二叉树,其中N是输入,并执行100次遍历,在每个节点上执行只读操作。基准测试是使用几个月前的llvm主干分叉编译的
clang

基准测试是一个单线程应用程序运行在单个核心上

测试中的系统 系统1 CPU:Ryzen螺纹裂土器1950x()
内存:32GB DDR4 2666
操作系统:Ubuntu 20.04,内核5.4.0

系统2 CPU:Epyc 7601()
内存:128 GB DDR4 2133
操作系统:Ubuntu 20.04,内核5.8.0

系统3 CPU:Epyc 7371()
内存:128 GB DDR4 2133
操作系统:Ubuntu 20.04,内核5.4.48

业绩摘要 当以N=22运行基准时,得到下表。(墙时间、IPC和缓存引用/未命中):

构建了两个二进制文件,一个在Threadripper(TR-bin)上,另一个在Epyc 7601(Epyc-bin)上

无论使用哪种二进制文件,Epyc IPC都比Threadripper上的低很多。挂机时间仅供参考,但由于处理器的频率不同,可能不应直接比较。使用
taskset
将基准测试固定在一个核心上不会产生明显不同的数字

从表面上看,IPC差异是由L2未命中的显著差异造成的 (性能事件
二级缓存\u请求\u stat.ls\u rd\u blk\u c
)。这种情况下的一个常见疑点是每个核的L2大小不同。然而,根据文档,所有处理器的每个核心都有相同的512KB二级缓存。此外,我运行了
lmbench
,获得了三个系统上的读取延迟,如下图所示

两个螺纹裂土器图表完全相同,便于纵向和横向比较。请注意,“内存墙”的大小大致相同,这进一步表明这些处理器的每个内核的缓存大小相同。另一方面,不同步幅的访问延迟暗示Threadripper可能具有异常有效的预取器。但是,在Threadripper上关闭预回迁器只会使L2未命中率增加一倍(如第一张图所示),而且Epyc机器上的L2未命中率仍然很低

最后,改变工作集大小以测试缓存大小的影响。最后一个图显示了工作集大小变化时的IPC。基准测试被修改为运行1000次迭代,以确保它运行足够长的时间来获得稳定的数字

尽管Epyc机器似乎有8MB LLC(每个CCX有4个核心),但当工作集大小从3MB变为6MB时,性能会下降

运行基准测试的不同方式 除了简单地运行基准测试之外,我还有两种方法

  • 使用
    taskset
    将基准固定到特定的核心
  • 使用
    numactl
    将基准锁定到特定的核心,并使用
    membind
    标志使用最接近核心的内存
两者都没有产生明显不同的轮廓

猜测 证据表明,处理器上的缓存大小相同。因此,二级未命中率的巨大差异可能是由于三级缓存分区造成的。也许Epyc在某些情况下会将每个核心的L3限制为4MB

总结 在Threadripper和Epyc机器上观察到相同基准的IPC显著差异。这种差异似乎是由Epyc处理器上异常高的L2未命中率造成的。但是,每个核心的缓存大小相同

是什么导致了二语失误的巨大差异?或者可能还有别的事
导致IPC差异?

所有3个CPU都使用相同的缓存到核心布局:4个核心共享一个8Mb三级缓存,这些CCX之间具有互连。因此,对于单线程工作负载,是的,您实际上拥有一个8MiB三级缓存。从L3到内存控制器的延迟可能会随着芯片的大小而变化,如果ThreadRipper和Epyc的互连之间存在任何定性差异,则IDK。因此,IDK ThreadRipper如何在工作集超过缓存大小时维护IPC。也许不同的硬件预取让它更频繁地隐藏延迟。看起来更快的RAM不太可能带来如此巨大的差异,但是IDK。ECC注册的DIMM(服务器内存)确实有较高的延迟,但您的lmbench结果似乎显示Epyc CPU上的DRAM延迟较低。@当工作集大小超过L3大小时,Peter命令线程裂土器上的IPC下降(1.8到约1.6)。这大约减少了10%。当工作集大小为96时,通过修改MSR关闭预取器确实会对TR(IPC从1.6变为1)产生重大影响,但它仍然没有打开预取器的Epycs那么糟糕。lmbench的结果暗示,当跨距很小时,TR可能有一个好的预取器,这很可能就是我们这里的情况。树节点大小为24字节。但我认为它们是同一个gen处理器,而且它们可能有相同的uarch。