我试图在一个特定的架构中尽量减少编译后汇编代码中分支指令的数量,因为处理器流水线的实现方式导致分支指令非常昂贵。
我可以尝试使用自修改代码来减少条件分支中测试条件的次数,但还有其他方法可以考虑吗?
我可以尝试使用自修改代码来减少条件分支中测试条件的次数,但还有其他方法可以考虑吗?
在编译代码中,你不应该过于关注分支指令的数量,而应该关注程序运行时分支指令被执行的次数。
有两种简单的方法可以减少执行分支指令的次数:
如果你的架构支持谓词指令,那么可以使用谓词指令生成小的if
块来替代分支。你可以要求编译器为你完成此操作。例如,如果你使用的是GCC编译器,则使用-O1,-O2,-O3或-Os
编译选项,或使用-fif-conversion2
标志即可实现。
请记住:大的if
块无法进行转换,因为谓词指令会通过CPU流水线传递,而不管条件是否为真。这会浪费时间。
展开循环。循环意味着分支。如果你展开循环,就可以减少执行分支的次数(尽管在编译代码中,你仍然会“看到”相同数量的分支指令,对吧?)。
但请记住:这会增加代码大小,可能导致指令缓存的缺失率增加。
例如:
for (i = 0; i < N; i++)
{
LOOP_BODY;
}
如果已知N是偶数,则手动展开两次的方法非常简单:
for (i = 0; i < N; i++)
{
LOOP_BODY;
i++;
LOOP_BODY;
}