别名信息可以简化这个程序集吗

问题描述

我有以下代码

void palette(char* in,int* out,int* palette,int n) {
    for(int i = 0; i < n ; ++i)
    {
        int value = palette[in[i]];
        out[i] = value;
    }
}

这是生成的编译器代码 https://godbolt.org/z/x3nvrW 我想知道是否有可能生成更好的程序集,因为输入和输出数据指向不同的内存位置。 是否有一些“别名”信息可以注入代码中,以便生成的程序集更好? (我真的无法理解 Godbolt 的输出

编辑:我的问题实际上是:

  • 知道没有混叠,我可以手动编写更快的程序集吗?
  • 如何使标准(或非标准)C++ 代码生成此程序集?

解决方法

生成的程序集看起来足够紧凑,以至于会达到内存带宽限制。这意味着您无法通过对指令进行轻微重组来修复。如果汇编函数能够小心地预取内存并击败 CPU 的预取器预测,它们会更快。

换句话说,您必须针对一个非常具体的 CPU 模型,并且对其内存架构有很多了解。典型的 C++ 编译器生成的代码在任何地方都运行良好,例如所示的程序集。

根本原因是缓存在使用并行硬件整理混叠方面非常有效,并且可以以许多 GB/秒的速度进行。