Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
较新的 ARM 处理器包括 PLD 和 PLI 指令。
我正在编写紧密的内部循环(在 C++ 中),它具有非顺序内存访问模式,但我的代码自然可以完全理解这种模式。如果我可以在处理当前内存位置的同时预取下一个位置,我预计会大大加快速度,并且我希望这足够快,值得尝试!
我正在使用来自 ARM 的新的昂贵编译器,它似乎没有在任何地方包含 PLD 指令,更不用说在我关心的这个特定循环中了。
如何在我的 C++ 代码中包含显式预取指令?
应该有一些编译器特定的功能。对于 C/C++,没有标准的方法可以做到这一点。查看您的编译器编译器参考指南。对于 RealView 编译器,请参见this或this。
如果您试图从这些循环中获得真正的最大性能,那么我建议您在汇编程序中编写整个循环结构。根据循环中涉及的数据结构,您应该能够使用内联汇编。如果您可以展开循环的任何部分(例如使访问不连续所涉及的部分),那就更好了。
冒着问显而易见的风险:您是否验证了编译器的目标架构?例如(幽默),如果默认情况下编译器针对 ARM7,您将永远不会看到 PLD 指令。
其他优化(如软件流水线和循环展开)可能会达到与您的预取想法相同的效果(通过将加载的延迟与有用的计算重叠来隐藏加载的延迟),但不会导致额外的指令缓存压力。通过额外的说明。我什至会说这种情况经常发生,因为紧密的内部循环往往只有很少的指令和很少的控制流。您的编译器是否正在执行这些类型的传统优化。如果是这样,可能值得查看流水线图,以开发更详细的处理器工作成本模型,并更定量地评估预取是否有帮助。