汇编 – 预取指令

预取使用的一般逻辑似乎是可以添加预取,只要代码忙于处理,直到预取指令完成其操作.但是,如果使用了太多的预取指令,则会影响系统的性能.我发现我们需要首先拥有没有预取指令的工作代码.之后,我们需要在各种代码位置进行各种预取指令的组合,并进行分析,以确定由于预取可能实际改善的代码位置.有没有更好的方法来确定使用预取指令的确切位置?
在大多数情况下,预取指令几乎没有任何益处,甚至在某些情况下甚至会产生反效果.大多数现代CPU具有自动预取机制,其工作原理足以使得添加软件预取提示几乎没有甚至干扰自动预取,并且实际上可以降低性能.

在一些极少数情况下,例如当您正在流式传输大量实际处理数据时,您可能会通过软件启动的预取来隐藏一些延迟,但是很难得到正确的 – 您需要在开始使用数据之前先启动几百个循环,这样做太晚了,你还是得到一个缓存未命中,做得太早,你的数据可能会在缓存中被逐出,然后才能使用它.通常这将使预取在代码的一些无关的部分,这对于模块化和软件维护是不利的.更糟糕的是,如果您的架构改变(新的CPU,不同的时钟速度等),使得DRAM访问延迟增加或减少,您可能需要将预取指令移动到代码的另一部分,以使其有效.

无论如何,如果您觉得您真的必须使用预取,我建议您使用任何预取说明进行#ifdefs,以便您可以使用和不使用预取来编译代码,并查看是否真的有助于(或阻碍)性能.

#ifdef USE_PREFETCH
    // prefetch instruction(s)
#endif

一般来说,我建议您将软件预取作为最后的手段,在完成所有更高效和显而易见的事情之后,将其作为最后的微观优化.

http://stackoverflow.com/questions/3122915/the-prefetch-instruction

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:汇编 – 预取指令