ARM上的预取指令

4
新的ARM处理器包括PLD和PLI指令。
我正在编写紧密的内部循环(使用C ++),其具有非顺序的内存访问模式,但该模式自然而然地被我的代码充分理解。如果我能在处理当前内存位置时预取下一个位置,我预计会获得显着的加速,并且我认为这足够快以值得尝试实验!
我正在使用来自ARM的新型昂贵编译器,但似乎没有在任何地方包含PLD指令,更不用说在我关心的特定循环中了。
如何在我的C++代码中包含显式的预取指令?

如果问题中包含您正在优化的特定循环的示例,贡献者可以帮助找到除PLD指令之外的优化,并可能给出具体示例。 - Loren Charnley
4个回答

5

应该有一些编译器特定的功能。 对于C/C ++,没有标准的方法来实现它。请查看您的编译器编译器参考指南。对于RealView编译器,请参见这里这里


1
如果您想从这些循环中真正提取最大的性能,我建议您使用汇编语言编写整个循环结构。根据循环涉及的数据结构,您应该能够使用内联汇编。如果您可以展开循环中的任何部分(例如参与使访问非顺序化的部分),那就更好了。

0
冒昧问一句:您是否验证了编译器的目标架构?例如(请原谅我的幽默),如果默认情况下编译器的目标是ARM7,那么您将永远看不到PLD指令。

0

其他优化,如软件流水线循环展开,也有可能实现与您的预取想法相同的效果(通过将负载延迟与有用计算重叠来隐藏它),但不会增加额外的指令缓存压力。我甚至可以说,在紧密的内部循环中,这种情况比不是更常见,因为这些循环往往只有少量指令和很少的控制流。您的编译器是否正在执行这些传统的优化?如果是,那么值得看一下管道图,以开发更详细的成本模型,了解处理器的工作方式,并更加定量地评估预取是否有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接