optimization - NASM 预取

标签 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]

谁能提供一个简明的指令示例,比如在给定地址缓存 256 个字节?提前致谢!

最佳答案

这些指令是用来建议 CPU 尝试将缓存行预取到缓存中的提示。因为它们是提示,所以 CPU 可以完全忽略它们。

如果 CPU 确实支持它们,那么 CPU 将尝试预取,但如果涉及 TLB 未命中,它将放弃(并且不会预取)。这是大多数人弄错的地方(例如,未能执行“预加载”,您插入一个虚拟读取以强制 TLB 加载,这样预取就不会被阻止工作)。

预取的数据量为 32 字节或更多,具体取决于 CPU 等。您可以使用 CPUID 来确定实际大小(CPUID 函数 0x00000004,EBX 位 0 到 31 中返回的“系统一致性行大小”)。

如果预取太晚则没有帮助,如果预取太早,数据可能会在使用前从缓存中逐出(这也无济于事)。 Intel 的“IA-32 Intel 体系结构优化引用手册”中有一个附录,描述了如何计算何时进行预取,称为“预取调度距离的数学”,您可能应该阅读。

另外不要忘记预取会降低性能(例如,导致需要驱逐数据以腾出空间)并且如果您不预取任何内容,CPU 有一个硬件预取器可能无论如何都会为您完成.您可能还应该阅读有关此硬件预取器如何工作(以及何时不工作)的信息。例如,对于顺序读取(例如 memcmp()),硬件预取器会为您完成,使用显式预取主要是浪费时间。对于 CPU 的硬件预取器不能/不会预测的“随机”(非顺序)访问,可能只值得为显式预取烦恼。

关于optimization - NASM 预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189484/

相关文章:

c# - 为 .Net 平台编写汇编代码

assembly - ARM:为什么立即数只有 12 位?

c++ - 为什么缓存行仅适用于模拟化?

linux - 文件存在,但 "No Such file Or Directory"

assembly - 汇编器什么时候使用像 R_X86_64_32S 这样的符号扩展重定位而不是像 R_X86_64_32 这样的零扩展更好?

C++:编译器是否优化整数 + 浮点算术运算?

c++ - 将整数序列写入全局内存的快速(est)方法?

linux - 如何一次取消保护跨越多个页面的内存区域?

optimization - scipy.optimize.fmin_l_bfgs_b 返回 'ABNORMAL_TERMINATION_IN_LNSRCH'

c# - 如何在安装结束时运行 nGen (MSI)?