如何使每帧分支优化友好
How to make a per-frame branch optimization-friendly?
假设我有一个主循环,每帧更新不同的内容:
int currentFrame = frame % n;
if ( currentFrame == 0 )
{
someVar = frame;
}
else if ( currentFrame == 1 )
{
someOtherVar = x;
}
...
else if ( currentFrame == n - 1 )
{
someMethod();
}
我可以使它对分支预测器更友好吗?分支预测器能否确定每个块将在每个n
帧执行一次?是否有分支无关的替代方案(怀疑,假设块中有足够不同的逻辑)?
请注意,将完全优化,switch
不会有太大的区别(如果有的话)。
正如我在上面评论的那样,没有任何代码示例,我想在这里很难提供任何有用的帮助。你能张贴一个代码片段,显示大量的分支错过?
我刚刚试了这样做:
#include <cstdlib>
__attribute__ ((noinline)) void frame(const int frame) // to prevent automatic unrolling
{
const int n = 10;
static int someVar = rand();
static int someOtherVar = rand();
const int currentFrame = frame % n;
if (currentFrame == 0) {
someVar = frame;
} else if (currentFrame == 1) {
someOtherVar += frame;
} else if (currentFrame == 2) {
someOtherVar -= someOtherVar;
someVar = someOtherVar;
} else if (currentFrame == 3) {
someVar -= someOtherVar;
} else if (currentFrame == 4) {
someVar -= someOtherVar;
someOtherVar *= someOtherVar;
} else if (currentFrame == 5) {
someOtherVar /= someVar + frame;
} else if (currentFrame == 6) {
someVar *= someOtherVar - frame;
} else if (currentFrame == 7) {
someOtherVar += someVar / (someOtherVar + 1);
} else if (currentFrame == 8) {
someVar -= someOtherVar * someVar;
} else if (currentFrame == n - 1) {
someOtherVar = frame;
someVar = frame + 1;
}
}
int main(int argc, char** argv)
{
int iterations = 100000000;
if (argc > 1) {
iterations = std::atoi(argv[1]);
}
for (int i = 0; i < iterations; ++i) {
frame(i);
}
return 0;
}
但这并不能再现你的发现:
Performance counter stats for './a.out 100000000':
591.088374 task-clock (msec) # 0.999 CPUs utilized
60 context-switches # 0.102 K/sec
5 cpu-migrations # 0.008 K/sec
272 page-faults # 0.460 K/sec
1,665,803,234 cycles # 2.818 GHz [50.25%]
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
3,741,605,478 instructions # 2.25 insns per cycle [75.14%]
1,050,201,459 branches # 1776.725 M/sec [75.14%]
11,115 branch-misses # 0.00% of all branches [74.64%]
0.591689393 seconds time elapsed
相关文章:
- 空基优化子对象的地址
- IPC使用多个管道和分支进程来运行Python程序
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何删除peer if else分支中的冗长句子
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- C++位掩码/条件分支优化
- 分支预测优化
- 通过将"goto"转换为分支机构进行优化
- 如何优化因 CPU 分支未命中而减慢的跳转指令
- 使用分支优化 CUDA 代码
- 针对已知的更常见的路径优化分支
- 优化:昂贵的分支vs廉价的比较
- 模板函数分支优化
- 分支预测及分支目标预测优化
- 为什么GCC没有尽可能地优化这组分支和条件?
- 为什么VS 2015编译器不能在浮点数的abs()实现中优化分支?
- 如何使每帧分支优化友好
- 帮助编译器优化分支代码序列
- 编译器有一定的优化启发式来支持分支预测吗?如果没有,为什么没有呢?