如果您正在编写一些将由另一个程序运行的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;
}
我可以通过一些聪明的伎俩来避免这种分支吗?
答案 0 :(得分:3)
大多数SIMD架构都有特殊说明,可让您根据掩码矢量有条件地选择元素。掩码矢量通常是SIMD比较指令的结果。所以,是的,很容易摆脱上面例子中的那种分支。
你是否真的需要去掉任何给定的分支,虽然取决于各种因素,例如分支的可预测性,数据的性质(统计数据)以及执行的代码量有条件的。根据经验,无分支是好的,但与大多数规则一样,也有例外。