对于WB / WC标记的区域,MOVDQA和MOVNTDQA以及VMOVDQA和VMOVNTDQ有什么区别?

时间:2013-09-26 18:16:21

标签: assembly x86 sse simd avx

使用标记为WB(回写)和WC(写入组合)的内存之间的主要区别是什么:MOVDQAMOVNTDQA之间有什么不同,VMOVDQA之间的区别是什么? 1}}和VMOVNTDQ

是否正确,内存已标记为WC - [NT]的指令与通常没有区别(没有[NT]),并且该内存标记为WB - {{1}的指令与它一起使用就好像它是一个内存WC?

2 个答案:

答案 0 :(得分:6)

在写入内存映射IO(即:GPU等)时,通常会使用NT(非时间)指令,其中内存严格不可缓存,并且始终直接访问。

通过定期读写,CPU将在需要时尝试缓存并将更大的块写入主内存。对于不可缓存的区域(例如MMIO),写入必须直接进入内存,CPU不会尝试缓存它们。使用NT指令向CPU提示您可能正在传输大量数据(即:到帧缓冲区等),当它可以填充整个缓存行时,它会尝试组合这些写入。

“非暂时”部分意味着您告诉CPU您不打算立即发生写入,但可以在合理范围内延迟写入,直到有足够的NT指令为止发出以填充缓存行。

据我了解,您还可以将NT指令与常规回写内存一起使用,它不会尝试缓存这些写入,但也会尝试在填充行时进行流式处理。在写入WB内存的情况下,我会说应用程序非常专业,你需要知道在管理缓存时你可以比CPU做得更好。此外,写入不会立即发生,因此之后回读的任何内容都会读取过时的数据,直到执行组合写入为止。如果需要刷新任何未完成的组合写入,则需要使用SFENCE指令对其进行管理。

最好直接从英特尔阅读 - 他们有很多关于这个主题的信息:

Increasing Memory Throughput With Intel® Streaming SIMD Extensions 4 (Intel® SSE4) Streaming Load

答案 1 :(得分:4)

当使用非时间指令时,请注意处理器勘误表,如果您需要针对内存屏障进行排序(例如LOCK ADD,MFENCE)。

勘误表HSD162,BDM116和SKL079适用,请参阅Haswell / Broadwell / Skylake规格更新。基本上,来自WC内存的非时间MOVNTDQA将绕过Haswell / Broadwell上的LOCK,你必须使用MFENCE来修复。在Skylake上,它被打破了另一种方式,因此来自WC内存的非时间MOVNTDQA将绕过MFENCE,修复是更新Skylake微码......