小编Jon*_*ert的帖子

如何解释 Xeon 处理器在具有顺序复制和分散存储的循环中性能不佳?

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

// array_a contains permutation of [0, n - 1]
// array_b and inverse are initialized arrays
for (int i = 0; i < n; ++i) {
  array_b[i] = array_a[i];
  inverse[array_b[i]] = i;
}
Run Code Online (Sandbox Code Playgroud)

循环的第一行按顺序复制array_aarray_b(预期很少有缓存未命中)。第二行计算array_b(许多缓存未命中,因为array_b是随机排列)的倒数。我们也可以将代码分成两个单独的循环:

for (int i = 0; i < n; ++i)
  array_b[i] = array_a[i];
for (int i = 0; i < n; ++i)
  inverse[array_b[i]] = i;
Run Code Online (Sandbox Code Playgroud)

我原以为这两个版本(单循环与双循环)在相对现代的硬件上的性能几乎相同。但是,在执行单循环版本时,某些 Xeon 处理器似乎非常慢。

您可以在下方看到以纳秒为单位n的挂机时间除以在一系列不同处理器上运行代码段的时间。出于测试目的,代码是使用 GCC 7.5.0 编译的,并-O3 -funroll-loops -march=native …

performance intel cpu-architecture cpu-cache amd-processor

14
推荐指数
1
解决办法
408
查看次数