我正在尝试最小化我编译的汇编代码中针对特定体系结构的分支指令的数量,其中由于实现处理器流水线的方式,分支指令非常昂贵。
我可以尝试实现自修改代码,以减少条件分支中必须测试条件的次数,但还有其他我可以看的事情吗?
答案 0 :(得分:2)
你 不应该 过分关注编译代码中可见的分支指令数量。 应该 关心运行程序时在CPU上执行分支指令的次数。
减少执行分支数量的两种简单方法:
如果您的体系结构支持谓词指令,则可以使用谓词指令而不是分支生成小if
块。您可以请求编译器为您执行此操作。例如如果您的编译器是GCC,那么使用-O1, -O2, -O3 or -Os
或使用-fif-conversion2
标志进行编译应该这样做。
请记住:大if
块不进行if转换,因为不管条件是否为真,谓词指令都会通过CPU管道传递。这浪费了周期。
展开循环。循环表示分支。如果你展开它,你可以逃脱执行更少的分支(虽然在编译代码中,你仍然'看到'相同数量的分支指令,对吗?)。
请记住:这会增加代码大小。这可能意味着指令缓存上的未命中率增加。
例如:
for (i = 0; i < N; i++)
{
LOOP_BODY;
}
如果已知N是偶数,则手动展开两次就像:
for (i = 0; i < N; i++)
{
LOOP_BODY;
i++;
LOOP_BODY;
}
执行此操作时,执行的分支数量基本上减半。
同样,您的编译器也可能自动执行此操作。例如GCC用-funroll-loops
展开一些循环。
编译器可以为您做一些其他技巧。例如如果它是GCC,那么你应该search this page for 'branch'。