在ARM上预取指令
时间:2020-03-05 18:58:41 来源:igfitidea点击:
较新的ARM处理器包括PLD和PLI指令。
我正在编写紧密的内部循环(在C ++中),该循环具有非顺序的内存访问模式,但是我的代码自然可以完全理解这种模式。如果可以在处理当前内存位置的同时预取下一个位置,则可以大大提高速度,并且我希望这样做足够快,值得尝试一下!
我使用的是来自ARM的昂贵的新编译器,而且似乎没有在任何地方包含PLD指令,更不用说在我关心的特定循环中了。
如何在我的C ++代码中包含显式的预取指令?
解决方案
回答
应该有一些特定于编译器的功能。对于C / C ++,没有标准的方法可以做到这一点。请查阅《编译器编译器参考指南》。对于RealView Compiler,请参见此内容。
回答
如果我们试图从这些循环中获取真正的最大性能,那么我建议我们在汇编器中编写整个循环结构。我们应该能够使用内联汇编程序,具体取决于循环中涉及的数据结构。如果我们可以展开循环的任何部分(例如使访问成为非顺序访问所涉及的部分),那就更好了。
回答
冒着问一个明显的风险:我们是否验证了编译器的目标体系结构?例如(对不起,我),如果默认情况下编译器是针对ARM7的,则我们永远不会看到PLD指令。
回答
其他优化(例如,软件流水线和循环展开)可能不会达到与预取想法相同的效果(通过将有用的计算重叠来隐藏负载的延迟),但不会造成额外的指令缓存压力,这并非不可能通过额外的指示。我什至会说这种情况经常发生,因为紧密的内部循环往往几乎没有指令,控制流程也很少。编译器是否正在执行这些类型的传统优化。如果是这样,可能有必要查看流水线图,以开发出处理器工作方式的更详细的成本模型,并更定量地评估预取是否有帮助。