SIMD倾向于总是去掉分支
Is the preference with SIMD to always get rid of branching?
如果您正在编写一些将由另一个程序运行的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比较指令的结果。所以,是的,很容易去除上面例子中的分支。
不过,您是否真的需要来摆脱任何给定的分支将取决于各种因素,如分支的可预测性、数据的性质(统计数据)以及有条件执行的代码数量。根据经验,无分支是好的,但与大多数规则一样,也有例外。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- IPC使用多个管道和分支进程来运行Python程序
- c++r值引用应用于函数指针
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如何仅使用对象名称打印特定于对象的成员
- 相当于LocaleMatcher的ICU4C
- 等<thing>效于char32_t
- 类似于strcat()的函数出现问题
- 如何删除peer if else分支中的冗长句子
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 如何正确地将分支添加到已存在的树中
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 如何将分支添加到已存在的TTree:ROOT
- 分支于空对象与空对象性能
- 如何避免参数数量依赖于条件的调用分支?
- 如果地址-B访问倾向于访问地址-C访问,则缓存可以识别
- srand() 和 rand() 倾向于产生负数
- SIMD倾向于总是去掉分支
- 为什么 Eigen 的示例代码倾向于使用<float>类?