问题描述
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 的输出)
编辑:我的问题实际上是:
解决方法
生成的程序集看起来足够紧凑,以至于会达到内存带宽限制。这意味着您无法通过对指令进行轻微重组来修复。如果汇编函数能够小心地预取内存并击败 CPU 的预取器预测,它们会更快。
换句话说,您必须针对一个非常具体的 CPU 模型,并且对其内存架构有很多了解。典型的 C++ 编译器生成的代码在任何地方都运行良好,例如所示的程序集。
根本原因是缓存在使用并行硬件整理混叠方面非常有效,并且可以以许多 GB/秒的速度进行。