WB/WC 标记区域的 MOVDQA 和 MOVNTDQA 以及 VMOVDQA 和 VMOVNTDQ 有啥区别?

Posted

技术标签:

【中文标题】WB/WC 标记区域的 MOVDQA 和 MOVNTDQA 以及 VMOVDQA 和 VMOVNTDQ 有啥区别?【英文标题】:What is the difference between MOVDQA and MOVNTDQA, and VMOVDQA and VMOVNTDQ for WB/WC marked region?WB/WC 标记区域的 MOVDQA 和 MOVNTDQA 以及 VMOVDQA 和 VMOVNTDQ 有什么区别? 【发布时间】:2013-09-26 18:16:20 【问题描述】:

使用标记为 WB(回写)和 WC(写结合)的内存指令之间的主要区别是什么:MOVDQAMOVNTDQA 有什么不同,VMOVDQA 和 @987654324 有什么不同@?

对吗,内存被标记为 WC - 带有[NT] 的指令与通常没有区别(没有[NT]),并且内存被标记为 WB - 带有[NT] 的指令与它一起工作,好像是记忆厕所吗?

【问题讨论】:

【参考方案1】:

在写入内存映射 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

【讨论】:

谢谢。但是 WC(写入组合)内存区域呢?即使没有 [NT],它也已经是“不可缓存的写入组合(USWC)内存” - 正如您的链接在文章中所写,我是否需要在此 WC 内存中使用 [NT]这种情况,为了什么? @Alex - 您不必将 combine 写入 USWC,但如果您不这样做,则写入可能需要更长的时间,因为 CPU 没有写入缓存但它必须写入在执行下一条指令之前一直到主存。如果您正在按顺序写入一个大块,NT 指令允许您通过向 CPU 提示您将对其进行更多写入并推迟传输到主存储器直到它可以来节省时间一口气完成整行。 @Alex - 您可以将其视为不可缓存内存的一种可选“假缓存”。我说“假”缓存是因为在 NT 指令和实际执行实际内存的组合读/写之间变得陈旧(而使用真正的缓存,CPU 知道哪个值是当前的并且可以立即访问它)。【参考方案2】:

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

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

【讨论】:

在带有更新微码的 SKL 上,mfence 是无序执行所有内容的障碍,包括 ALU 指令。所以它就像lfence。这对性能很糟糕:(Are loads and stores the only instructions that gets reordered?

以上是关于WB/WC 标记区域的 MOVDQA 和 MOVNTDQA 以及 VMOVDQA 和 VMOVNTDQ 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中针对区域语言标记信息的操作

LeetCode 0130.被围绕的区域 - BFS:标记没有被围绕的区域

当且仅当区域在 Emacs 中处于活动状态时,标记是不是处于活动状态?

Android Google Map如何检查用户是不是在标记矩形区域

滚动 mapView 或点击标记时,如何创建具有自定义注释和区域焦点的地图?

使谷歌地图标记在区域/区域内可拖动?