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

我正在编写紧密的内部循环(用 C++ 编写),它具有非顺序内存访问模式,但我的代码自然可以完全理解该模式。如果我可以在处理当前内存位置的同时预取下一个位置,我预计会有显着的加速,并且我希望这足够快,值得尝试!

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

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

有帮助吗?

解决方案

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

其他提示

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

冒着问显而易见的风险:您验证了编译器的目标架构吗?例如(幽默一下),如果默认情况下编译器针对 ARM7,那么您 绝不 去看PLD指令。

其他优化(如 软件流水线循环展开 可能会达到与预取想法相同的效果(通过与有用的计算重叠来隐藏加载的延迟),但不会因额外指令而造成额外的指令缓存压力。我什至可以说,对于往往只有很少指令和控制流的紧密内部循环来说,这种情况经常发生。您的编译器是否正在执行这些类型的传统优化?如果是这样,可能值得查看管道图,以开发有关处理器工作方式的更详细的成本模型,并更定量地评估预取是否有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top