5

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

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

4

3 回答 3

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 < b而不会生成分支指令。它还扼杀了可读性。

这值得么?有时,但通常不会。如果分支或分支错误预测因为它不偏向一个分支或另一个分支而让您付出了很多代价,那么它可能是值得的。但可能不是。一如既往,简介。

如果这是您的目标,那么一点点数学/算术可以在消除分支方面大有帮助。虽然之前已经说过无数次了,只是因为你可以做某事,并不意味着你应该这样做。

希望这可以帮助。

于 2013-05-04T00:01:59.897 回答
1

这是教程有更多的例子。除了这里的内容,我还可以考虑使用 switch statements 或sentinel values。我还发现了另一个教程,其中介绍了避免 if 语句的更晦涩的方法。

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

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

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

于 2013-05-03T22:57:21.090 回答
0

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

于 2013-05-03T22:57:38.340 回答