C++ SIMD是否总是希望摆脱分支?

C++ SIMD是否总是希望摆脱分支?,c++,performance,optimization,concurrency,simd,C++,Performance,Optimization,Concurrency,Simd,如果您正在编写一些将由另一个程序运行的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; }

如果您正在编写一些将由另一个程序运行的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;
}

我可以用一些巧妙的技巧避免这种分支吗?

大多数SIMD体系结构都有特殊的指令,允许您根据掩码向量有条件地选择元素。掩码向量通常是SIMD比较指令的结果。是的,去掉上面例子中的那种分支是很容易的


然而,您是否真的需要删除任何给定的分支将取决于各种因素,例如分支的可预测性、数据的性质(统计数据)以及有条件地执行多少代码。根据经验,无分支是好的,但与大多数规则一样,也有例外。

这实际上取决于分支是否可预测。如果您在一行中多次调用此函数,并且“axis”的值相同,那么这样更好。如果
axis
看起来是随机的,那么就值得对它们进行优化。如果您可以将其内联到设置轴的代码中,那么这并不重要,因为您无论如何都不会得到分支。谢谢,轴对于所有调用都是固定的。同样,内联是指只内联适当的分支吗?如果是这样,那就太好了。我将检查编译器是否这样做。如果这个函数内联,那么生成的代码应该只有take分支。如果此函数太大而无法内联,您可能希望为axis的每个值制作一个函数版本(仅使用该分支),然后使用一个内联的“包装器”函数,该函数根据axis的值选择适当的非内联函数。内联包装器应该消除分支并调用正确的无分支函数。这实际上是在主函数中,而不是在单独的函数中。如果我将它分离到另一个函数中,或者将它保留在主函数中,这有关系吗?我认为它不是太大或太一般,与主函数关系不大,因为没有其他函数使用它。谢谢,实际上程序调用我的函数时知道值是固定的,但如果我想,我可以在程序中使其动态,但即使这样,程序也会意识到值与调用我的函数的值不同。我不确定它是否使用了这些信息。在分支中打印一些东西,看看是打印一次还是为每个实体/元素打印一次,这会证明编译器确实对此进行了优化吗?如果不知道您使用的是什么CPU、编译器等,就很难给出具体的建议。通常,您希望查看生成的代码(例如,
gcc-S
)和/或使用探查器来识别性能瓶颈。