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