Performance 如何解释Xeon处理器在同时具有顺序拷贝和分散存储的循环中性能不佳?

Performance 如何解释Xeon处理器在同时具有顺序拷贝和分散存储的循环中性能不佳?,performance,intel,cpu-architecture,cpu-cache,amd-processor,Performance,Intel,Cpu Architecture,Cpu Cache,Amd Processor,在某些英特尔至强处理器上运行以下c++代码时,我偶然发现了一个特殊的性能问题: //数组a包含[0,n-1]的置换 //数组_b和逆数组是初始化的数组 对于(int i=0;i

在某些英特尔至强处理器上运行以下
c++
代码时,我偶然发现了一个特殊的性能问题:

//数组a包含[0,n-1]的置换
//数组_b和逆数组是初始化的数组
对于(int i=0;i
循环的第一行按顺序将
array_a
复制到
array_b
(预期很少有缓存未命中)。第二行计算
array_b
的倒数(由于
array_b
是一种随机排列,因此预期会出现许多缓存未命中)。我们还可以将代码拆分为两个单独的循环:

for(int i=0;i
我本以为这两个版本(单循环与双循环)在相对现代的硬件上的性能几乎相同。然而,似乎有些Xeon处理器在执行单循环版本时速度非常慢

在下面,您可以看到在一系列不同的处理器上运行代码片段时,墙时间(以纳秒为单位)除以
n
。出于测试目的,在配备Xeon E5-4620v4的系统上,使用GCC 7.5.0编译代码,并带有标志
-O3-funroll loops-march=native
。然后,在所有系统上使用相同的二进制文件,在具有多个NUMA域的系统上使用
numactl-m0-n0

所用代码可在上找到。有趣的东西在档案里

[编辑:]提供了组件。

[编辑:]包括AMD EPYC在内的新结果。

在各种i7模型上,结果与预期基本一致。使用单循环仅比双循环稍微慢一点。这也适用于Xeon E3-1271v3,它与i7-4790的硬件基本相同。AMC EPYC 7452迄今为止表现最好,单环和双环实现几乎没有区别。然而,在Xeon E5-2690v4和E5-4620v4系统上,使用单回路速度非常慢

在以前的测试中,我也在Xeon E5-2640和E5-2640v4系统上观察到了这个奇怪的性能问题。与此相反,AMD EPYC和Opteron系统上没有性能问题,Intel i5和i7移动处理器上也没有性能问题


因此,我向CPU专家提出的问题是:为什么英特尔最高端的产品线与其他CPU相比表现如此糟糕?我目前还不是CPU体系结构方面的专家,因此非常感谢您的知识和想法

我认为这是一个很好且有趣的问题,尽管我不确定它是否比堆栈溢出更适合超级用户。Xeon E5-2640不是v3还是其他什么?那是一只笨重的旧山猫?i、 e.“英特尔最高端的产品线”,在AMD系统出现之前的十年中,在i7-6800k Broadwell出现之前的几年中。顺便说一句,像这样的性能调优问题完全是关于堆栈溢出的;我们有一个完整的标签,其中肯定包括这样的问题。同样相关的:(尽管您的问题更多的是分散访问,而不是太多的带宽)。发生在“笨重的旧”Xeon E5-2640,以及更新的Xeon E5-2640v4和E5-4640v4上。一般来说,在哪台机器上编译代码并不重要——即使我在Xeon上编译时使用
-march=native
,然后在AMD系统上使用生成的二进制文件(反之亦然)。问题依然存在。最好在每个系统上运行相同的二进制文件,并提供两种核心函数变体的反汇编。