C 无跳跃编程

C 无跳跃编程,c,optimization,C,Optimization,我试图找到关于无跳跃编程(x86arch)的文章、书籍或任何东西。我知道这通常是不可能的,但我尽量避免跳转,但gcc即使使用内联func也会多次使用跳转。仅在汇编中编码是一种解决方案,但在C中编写相当于1000行的代码对我来说就像地狱派对一样。不跳转编码并非不可能,但尝试似乎毫无意义 最后,如果你需要做不止一次的事情,那么你的选择是: 循环展开(即重复代码而不是循环) 以某种方式让指令指针多次访问同一代码 第一种方法要求提前知道迭代次数,并且不可伸缩,第二种方法涉及某种跳跃。除非跳跃是真正随

我试图找到关于无跳跃编程(x86arch)的文章、书籍或任何东西。我知道这通常是不可能的,但我尽量避免跳转,但gcc即使使用内联func也会多次使用跳转。仅在汇编中编码是一种解决方案,但在C中编写相当于1000行的代码对我来说就像地狱派对一样。

不跳转编码并非不可能,但尝试似乎毫无意义

最后,如果你需要做不止一次的事情,那么你的选择是:

  • 循环展开(即重复代码而不是循环)
  • 以某种方式让指令指针多次访问同一代码

第一种方法要求提前知道迭代次数,并且不可伸缩,第二种方法涉及某种跳跃。

除非跳跃是真正随机的,否则分支预测应该消除大部分涉及的开销

我将致力于优化内存访问模式,以改进局部性并减少缓存未命中。如今,内存延迟是性能的主要瓶颈


另一个好的方向是改进并行性(同时使用矢量化SIMD指令,如果可能的话,使用多个内核)。

我想你可能是指分支。在C语言中,有一些位旋转技巧可以用来加速某些操作

见比特黑客:


只优化性能关键型代码,并且只在您真正知道它是性能关键型代码时才进行优化。不要仅仅因为读到跳转会影响性能而试图优化跳转。每件事都会导致性能下降,最快的代码就是什么也不做的代码。还有比跳跃更糟糕的事情

如果您将在生成的代码中显示一个跳转的特定示例,可能会有一些方法来避免它,但您将显示的代码更有可能仍然包含更严重的问题


避免分支的一种特殊方法是使用“条件移动”指令。它们可以用于计算最大值或最小值。如果允许编译器使用SSE体系结构,则假定CPU也支持CMOV/FCOMI/FCOMIP/FUCOMI/FUCOMIP指令,并将使用它们(注意:有时可能很难让编译器执行您想要的操作,请参见示例)。

不知道您的代码是什么样子,很难给出任何建议。但我会试试看

在开始优化之前,请运行分析工具来定位问题区域。优化后,再次运行分析工具,查看是否确实加快了速度

实际上很难删除分支,但可以通过循环展开来最小化它们

有人提到了条件移动指令,ARM架构上有很多条件指令,但是如果不执行它们,它们将转换为NOP,每个循环一次。不确定它们在x86上是如何工作的。实际上,它可能会比使用简单分支慢,这取决于管道的长度


在删除分支之前,您还可以尝试许多其他优化技巧。

您能告诉我们为什么要这样做吗?历史上有很多关于高级编程语言中的
goto
的讨论,但是如何避免跳转呢?我无法理解这件事。。。。你到底为什么还要这样?你为什么要避免跳跃?除非是为了一些学术活动,否则它没有任何用处。我在某个地方读到,管道预测算法没有那么有效。换句话说,我试图获得更多关于如何获得最佳性能的信息。(我认为)与处理器交谈而不误解是其中之一。是的,我知道我不想优化日志记录或打印;)但这1000行是我的平均关键代码。如果你能展示一些代码,你可能会得到更好的答案。正如你接受的答案所显示的,你仍然不知道你真的想要优化跳转。如果您真的关心这样的优化,请使用VTune或AMD Code Analyst之类的指令级分析器—它将准确地显示哪些指令花费的时间最多,等等。