Pre*_*sor 2 optimization assembly nasm intel-syntax
我在NASM文档中遇到了以下说明,但我无法完全了解它们.可悲的是,英特尔关于这些说明的文档也有些缺乏.
PREFETCHNTA m8 ; 0F 18 /0 [KATMAI]
PREFETCHT0 m8 ; 0F 18 /1 [KATMAI]
PREFETCHT1 m8 ; 0F 18 /2 [KATMAI]
PREFETCHT2 m8 ; 0F 18 /3 [KATMAI]
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一个简明的指令示例,比如在给定地址缓存256个字节吗?提前致谢!
这些指令是用于建议CPU尝试将高速缓存行预取到高速缓存中的提示.因为它们是提示,所以CPU可以完全忽略它们.
如果CPU确实支持它们,那么CPU将尝试预取但是如果涉及TLB未命中则将放弃(并且不会预取).这是大多数人弄错的地方(例如,无法执行"预加载",您插入虚拟读取以强制TLB加载,以便不会阻止预取工作).
预取的数据量为32个字节或更多,具体取决于CPU等.您可以使用CPUID来确定实际大小(CPUID函数0x00000004,EBX位0到31中返回的"系统一致性行大小").
如果你预取得太晚也没有用,如果你过早预取数据,可以在使用之前从缓存中逐出数据(这也没有帮助).英特尔的"IA-32英特尔架构优化参考手册"中有一个附录,描述了如何计算预取时间,称为"预取调度距离数学",您应该阅读.
另外不要忘记预取可能会降低性能(例如导致需要被驱逐的数据以腾出空间),如果你没有预取任何东西,那么CPU有一个硬件预取器,无论如何都可能为你做这件事.您可能还应该阅读此硬件预取器的工作原理(以及何时不工作).例如,对于顺序读取(例如memcmp())硬件预取器为您执行此操作并使用显式预取主要是浪费时间.对于CPU的硬件预取器无法/不会预测的"随机"(非顺序)访问的显式预取,可能只值得打扰.