通过分支删除进行优化的现实例子

时间:2013-05-03 22:39:10

标签: c optimization intel branch-prediction

根据Intel,分支删除是优化C代码以在紧密循环中使用的最有效方法之一。但是,链接页面中的示例仅涵盖循环展开和在循环外移动不变分支。

是否有其他更改(之前和之后)分支删除示例以进行优化?

3 个答案:

答案 0 :(得分:4)

如果消除分支是您的目标,那么您可能希望考虑数学或一些非便携式解决方案。

考虑以下示例:

if (a < b)
    y = C;
else
    y = D;

这可以重写为......

x = -(a < b);   /* x = -1 if a < b, x = 0 if a >= b */
x &= (C - D);   /* x = C - D if a < b, x = 0 if a >= b */
x += D;         /* x = C if a < b, x = D if a >= b */

为了使上述工作正常,它假定您的处理器可以评估 a&lt; b ,不生成分支指令。它还会杀死可读性。

值得吗?有时,但通常不是。如果分支或分支错误预测花费了很多,因为它不偏向一个分支或另一个分支,可能值得。但可能不是。一如既往,简介。

如果这是你的目标,一点点的数学/算术可以在很长的时间内消除分支。虽然之前已经说过无数次,但仅仅因为你可以做某事,并不意味着你应该这样做。

希望这有帮助。

答案 1 :(得分:1)

这是tutorial还有一些例子。除了这里,我可以考虑使用switch语句或sentinel values。我还发现了other tutorial这些更为模糊的方法来避免if语句。

如果您正在进行优化,我强烈建议您使用分析工具,例如callgrind / kcachegrind,并专注于您花费最多时间的代码部分。以某种方式优化代码可能会使代码混淆或使其难以维护,而根据我的经验优化优化是一个非常糟糕的主意。

使用分析器后,您可能会发现使用更好的数据结构或避免某种算法的代码可能是优化C代码的最有效方法,而不是分支删除。

我不是故意要说教,我只是不同意删除分支是优化代码的最佳方法的前提。我知道这对现代处理器有很大的帮助,但任何优化工作的第一步应该是找到代码的慢速部分然后从那里开始。

答案 2 :(得分:0)

最佳块排序可以产生相当大的差异,并且出现在每一段代码中。而且我不会轻易将英特尔给出的例子视为“不切实际”。