最初,提出了关于组合循环中执行的元素加法之间的性能差异的问题循环与单独循环。然而,后来对其进行了修改,以深入了解导致这些性能变化的缓存行为。
为什么逐元素加法在单独的情况下明显更快循环比组合循环?
进一步分析,是认为此行为是由操作中使用的四个指针的数据对齐问题引起的,可能导致缓存组/路冲突。具体来说,数组很可能分配在同一页行上,导致每个循环内的访问落在同一高速缓存路径上。这比将访问分布在多个缓存方式上的效率要低,这在单独分配数组时是可能的。
您能否提供一些深入了解导致不同缓存行为的细节,如以下五个区域所示图?
区域 1: 数据集非常小,性能主要由开销(例如循环和分支)决定,而不是缓存行为。
区域 2: 之前归因于对齐问题,进一步分析表明该区域的性能下降需要进一步调查。缓存组冲突仍然可能是一个因素。
区域 3:数据大小超过 L1 缓存容量,导致 L1 到 L2 缓存带宽造成性能限制。
区域 4: 在单循环版本中观察到的性能损失可能是由于处理器中的错误混叠停顿造成的由数组对齐引起的加载/存储单元。当处理器推测性地执行加载操作并遇到使用不同值对同一地址进行第二次加载时,就会发生错误别名。在这种情况下,处理器必须丢弃推测加载并重新加载正确的值,从而导致性能损失。
区域 5: 此时,数据大小超出了两者的容量L1 和 L2 缓存,导致内存带宽带来性能限制。
通过为这些 CPU 提供类似的图表来指出 CPU/缓存架构之间的差异也可能很有趣。
提供的图表表示从两个 3.2 GHz 的 Intel Xeon X5482 Harpertown 处理器收集的数据。对其他架构(例如英特尔酷睿 i7 870 @ 2.8 GHz 和英特尔酷睿 i7 2600K @ 4.4 GHz)进行的类似测试生成的图表显示了类似的区域,但具体性能值可能有所不同。这些差异可归因于缓存大小、内存带宽和其他架构特征的差异。
以上是考虑到缓存行为,为什么单独循环中的元素添加比单个循环中更快?的详细内容。更多信息请关注PHP中文网其他相关文章!