SIMD的偏好总是摆脱分支吗?

时间:2012-01-17 23:02:58

标签: 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;
}
else if (axis == 2)
{
    p = point.x;
    q = point.y;
}

我可以通过一些聪明的伎俩来避免这种分支吗?

1 个答案:

答案 0 :(得分:3)

大多数SIMD架构都有特殊说明,可让您根据掩码矢量有条件地选择元素。掩码矢量通常是SIMD比较指令的结果。所以,是的,很容易摆脱上面例子中的那种分支。

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