减少 CPU 指令大小的 C++ 技术?

C++ techniques for reducing CPU instruction sizes?

每条CPU指令消耗一定数量的字节。尺寸越小,CPU缓存中可以容纳的指令最多。

编写 C++ 代码时可以使用哪些技术来减少 CPU 指令大小?

一个例子可以是减少 FAR 跳转的次数(字面意思是跳转到更大地址的代码)。因为偏移量是一个更小的数,所以使用的类型也更小,整个指令也更小。

我认为 GCC 的 __builtin_expect 可以通过将不太可能的指令放在更远的地方来减少跳转指令的大小。

我想我在某处看到使用 int32_t 而不是 int16_t 更好,因为它是原生的 CPU 整数大小,因此效率更高 CPU说明。

或者是什么只能在编写汇编时才能完成?

既然我们都为 micro/macro 优化而战,让我们尝试帮助解决实际问题。

我没有完整、明确的答案,但您可以开始 here。 GCC 有一些宏钩子来描述目标硬件的性能特征。理论上您可以设置一些关键宏来帮助 gcc 在优化时支持 "smaller" 指令。

根据来自 this question and its one reply 的非常有限的信息,您或许可以从 TARGET_RTX_COSTS 成本挂钩中获得一些收益。我还没有做足够的后续研究来验证这一点。

我猜想像这样连接到编译器比任何特定的 C++ 习语更有用。

如果您管理任何性能提升,请告诉我们。我很好奇。

如果处理器有不同长度(多字节)的指令,您能做的最好的事情就是编写代码来帮助编译器利用较小的指令大小。

首先让代码稳健工作并纠正错误。

调试优化代码比调试未优化代码更困难。调试器使用的符号与源代码更好地对齐。在优化期间,编译器可以消除代码,这会使您的代码与源代码列表不同步。

了解您的组装说明

并非所有处理器都具有可变长度指令。熟悉您的处理器指令集。找出哪些指令是小的(一个字节)与多字节的。

编写代码以使用小型汇编指令 帮助您的编译器并编写您的代码以利用小长度指令。

打印出汇编语言代码以验证编译器是否使用了小指令。

必要时更改您的代码以帮助编译器。

不能保证编译器会使用小指令。编译器根据优化设置发出它认为具有最佳性能的指令。

编写自己的汇编语言函数

生成汇编语言源代码后,您现在可以更好地用汇编语言版本替换高级语言。您可以自由使用小指令。

当心胡言乱语

更小的指令可能不是所有情况下的最佳解决方案。例如,英特尔处理器具有块指令(对数据块执行操作)。这些块指令比小指令循环执行得更好。但是,块指令比较小的指令占用更多字节。

处理器将根据指令将尽可能多的字节提取到其指令缓存中。如果您可以编写适合高速缓存的循环或代码,那么指令大小就不再是一个问题。

此外,许多处理器将使用大型指令与其他处理器通信,例如浮点处理器。减少程序中的浮点数学运算可能会减少这些指令的数量。

Trim 代码树 & 减少分支

一般来说,分支会减慢处理速度。分支是执行到新位置的更改,例如循环和函数调用。处理器喜欢数据指令,因为它们不必重新加载指令管道。增加数据指令的数量和减少分支的数量将提高性能,通常与指令大小无关。