【发布时间】:2012-02-12 17:54:14
【问题描述】:
如果您正在编写一些将由另一个程序运行的 SIMD 代码,那么摆脱分支以提高性能总是有利的吗?我听说即使只是为了避免if/else 语句等而进行额外的操作仍然要快得多。
我问这个是因为我做了一些分支,基本上是这样的:
// axis; x=0, y=1, z=2
float p, q;
if (axis == 0)
{
p = point.y;
q = point.z;
}
else if (axis == 1)
{
p = point.x;
q = point.z;
}
else if (axis == 2)
{
p = point.x;
q = point.y;
}
我可以通过一些巧妙的技巧来避免这种分支吗?
【问题讨论】:
-
这真的取决于分支是否可预测。如果您连续多次使用相同的“axis”值调用此函数,那么这种方式会更好。如果
axis看起来很随机,那么值得优化它们。如果您可以在设置axis的代码中内联它,那么这无关紧要,因为无论如何您都不会得到分支。 -
谢谢,所有调用的轴都是固定的。另外,内联是指仅内联适当的分支吗?如果是这样,那将是甜蜜的。我会检查编译器是否这样做。
-
如果这个函数内联,那么生成的代码应该只有采用的分支。如果这个函数太大而不能内联,您可能希望为每个轴值(只有那个分支)制作一个函数版本,然后有一个“包装器”函数进行内联,它选择适当的非内联函数
axis的值。内联包装器应该消除分支并调用正确的无分支函数。 -
另外这其实是在主函数中,而不是在单独的函数中。如果我将它分成另一个函数或将它保留在主函数中,这有关系吗?我认为它不是太大或通用,并且与主要功能非常相关,因为没有其他人使用它。
标签: c++ performance optimization concurrency simd