Optimization 我可以控制g+中的寄存器分配吗+;? 我有一个高度优化的C++片段,在热点以外的地方做微小的改动可以达到20%的性能。经过更深入的调查,结果证明(可能)热点中使用的寄存器略有不同。 我可以使用always_inline属性控制内联,但我可以控制寄存器分配吗?

Optimization 我可以控制g+中的寄存器分配吗+;? 我有一个高度优化的C++片段,在热点以外的地方做微小的改动可以达到20%的性能。经过更深入的调查,结果证明(可能)热点中使用的寄存器略有不同。 我可以使用always_inline属性控制内联,但我可以控制寄存器分配吗?,optimization,gcc,g++,inline,cpu-registers,Optimization,Gcc,G++,Inline,Cpu Registers,这取决于您使用的处理器。或者我应该说,是的,你可以使用register关键字,但这是不赞成的,除非你使用的是一个没有管道内衬和单核的简单处理器。如今,GCC可以比您在寄存器分配方面做得更好。相信它。一般来说,所有现代编译器都会忽略register关键字。唯一的例外是(相对而言)最近添加了一个错误,如果您试图获取用register关键字标记的变量的地址 我也经历过这种痛苦,最终找到了唯一真正解决问题的方法,就是查看输出程序集,试图确定是什么导致gcc脱离deepend。您还可以做其他事情,但这完全

这取决于您使用的处理器。或者我应该说,是的,你可以使用register关键字,但这是不赞成的,除非你使用的是一个没有管道内衬和单核的简单处理器。如今,GCC可以比您在寄存器分配方面做得更好。相信它。

一般来说,所有现代编译器都会忽略register关键字。唯一的例外是(相对而言)最近添加了一个错误,如果您试图获取用register关键字标记的变量的地址


我也经历过这种痛苦,最终找到了唯一真正解决问题的方法,就是查看输出程序集,试图确定是什么导致gcc脱离deepend。您还可以做其他事情,但这完全取决于您的代码试图做什么。我在一个非常非常大的函数中工作,其中包含大量的计算goto混乱,其中微小的(看似无害的)更改可能会导致灾难性的性能损失。如果你正在做类似的事情,你可以做一些事情来尝试缓解这个问题,但是细节有点棘手,所以我将放弃在这里讨论它们,除非它实际上是相关的。

如果你真的想搞乱寄存器分配,那么你可以强制GCC在某些寄存器中分配局部和全局变量

您可以使用一个特殊的变量声明来执行此操作,如下所示:

 register int test_integer asm ("EBX");
也适用于其他体系结构,只需使用特定于目标的寄存器名替换EBX即可

有关这方面的更多信息,我建议您查看gcc文档:

然而,我的建议是,除非你有很好的理由,否则不要干扰寄存器分配。如果您自己分配一些寄存器,分配器要处理的寄存器就更少了,您可能会得到比开始时更糟糕的代码

如果您的函数对性能非常关键,您可以在编译之间获得20%的性能差异,那么最好在内联汇编程序中编写该函数



编辑:正如strager指出的那样,编译器不必为变量使用寄存器。只有在使用变量时才强制使用寄存器。例如,如果变量未通过优化过程,则不会使用该变量。寄存器也可以用于其他变量。

实际上,语法是“在处理test_integer时使用此寄存器”。它不强制EBX为test_整数。相反,它强制test_integer为EBX。(至少从我从文档中收集到的信息)我认为你应该在回答中更清楚地说明这一点。好链接。内联asm不是一个选项。热点太大了。Lukasz,如果你不想使用内联汇编程序,你也可以使用一个运行良好的编译目标代码,将其反汇编并使用生成的asm代码。我完全喜欢你说的使用内联汇编程序的方式。每当我们想做一些真正令人敬畏的事情时,我们必须在文明中后退一步,嗯Pafaik goto将严重影响编译器的优化能力,这可能会导致有趣的输出。是的,但是计算goto对于解释器来说非常有用,因为您正在有效地编写一系列goto(标准解释器是while(1)switch(…){pile of code},或者statementNode->execute(…)(其中execute是一个虚拟函数)@Calyth:Regular goto不会影响优化——编译器必须对内联函数中的break/continue语句和return语句执行基本相同的操作。另一方面,计算goto会减少优化机会和流水线CPU上的执行速度。实际上,常规goto会影响优化,因为它们会以一种不一定对优化人员友好的方式(但琐碎的goto可以很容易地在内部转换为更容易优化的替代方案)来实现更高级别的行为。此外,对于流水线cpu来说,计算goto不一定较慢或更差。这完全取决于用例。在我上面提到的情况下(解释器)由于与分支预测器的交互更好,计算goto对于管道来说比其他选择要好得多。您是否会碰巧在32位x86中受到限制?因为64位x86有更多的寄存器(我想大约16个?)而且不应该有这样的问题…我尝试了64,但结果是速度较慢。我找不到原因。他的结果表明,在这种情况下,它是不可信的。他在不同的版本中获得了20%的性能波动!