较新的ARM处理器包括PLD和PLI指令。
我正在编写紧密的内部循环(在C ++中),它具有非顺序的内存访问模式,但是我的代码完全理解的模式。如果我可以在处理当前内存位置的同时预取下一个位置,我会预期会有大幅加速,我希望这很快就可以尝试值得实验!
我正在使用ARM新的昂贵的编译器,它似乎没有在任何地方包含PLD指令,更不用说我关心的这个特定循环了。
如何在C ++代码中包含显式预取指令?
答案 0 :(得分:5)
答案 1 :(得分:1)
如果您试图从这些循环中提取真正的最大性能,那么我建议在汇编程序中编写整个循环结构。您应该能够使用内联汇编,具体取决于循环中涉及的数据结构。如果你可以展开你的循环中的任何一部分(比如使访问非顺序访问所涉及的部分),那就更好了。
答案 2 :(得分:0)
冒着明显的问题:你有没有验证过编译器的目标架构?例如(幽默我),如果默认情况下编译器是针对ARM7的,那么永远不会看到PLD指令。
答案 3 :(得分:0)
software pipelining和loop unrolling之类的其他优化可能会达到与预取想法相同的效果(通过将负载与有用计算重叠来隐藏负载的延迟),这不在其他可能范围之外,但没有额外指令引起的额外指令缓存压力。我甚至会说这种情况经常发生,因为紧密的内环往往只有很少的指令和很少的控制流。您的编译器是否正在执行这些类型的传统优化。如果是这样,可能值得查看管道图,以开发更详细的成本模型,了解处理器的工作原理,并更准确地评估预取是否有用。