关于ARM的预取指令

时间:2008-09-17 12:11:55

标签: c++ arm assembly

较新的ARM处理器包括PLD和PLI指令。

我正在编写紧密的内部循环(在C ++中),它具有非顺序的内存访问模式,但是我的代码完全理解的模式。如果我可以在处理当前内存位置的同时预取下一个位置,我会预期会有大幅加速,我希望这很快就可以尝试值得实验!

我正在使用ARM新的昂贵的编译器,它似乎没有在任何地方包含PLD指令,更不用说我关心的这个特定循环了。

如何在C ++代码中包含显式预取指令?

4 个答案:

答案 0 :(得分:5)

应该有一些编译器特有的功能。 C / C ++没有标准的方法。看看编译器编译器参考指南。对于RealView编译器,请参阅thisthis

答案 1 :(得分:1)

如果您试图从这些循环中提取真正的最大性能,那么我建议在汇编程序中编写整个循环结构。您应该能够使用内联汇编,具体取决于循环中涉及的数据结构。如果你可以展开你的循环中的任何一部分(比如使访问非顺序访问所涉及的部分),那就更好了。

答案 2 :(得分:0)

冒着明显的问题:你有没有验证过编译器的目标架构?例如(幽默我),如果默认情况下编译器是针对ARM7的,那么永远不会看到PLD指令。

答案 3 :(得分:0)

software pipeliningloop unrolling之类的其他优化可能会达到与预取想法相同的效果(通过将负载与有用计算重叠来隐藏负载的延迟),这不在其他可能范围之外,但没有额外指令引起的额外指令缓存压力。我甚至会说这种情况经常发生,因为紧密的内环往往只有很少的指令和很少的控制流。您的编译器是否正在执行这些类型的传统优化。如果是这样,可能值得查看管道图,以开发更详细的成本模型,了解处理器的工作原理,并更准确地评估预取是否有用。