首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于WB/WC标记区域,MOVDQA与MOVNTDQA、VMOVDQA和VMOVNTDQ有什么区别?

对于WB/WC标记区域,MOVDQA与MOVNTDQA、VMOVDQA和VMOVNTDQ有什么区别?
EN

Stack Overflow用户
提问于 2013-09-26 18:16:20
回答 3查看 4.4K关注 0票数 9

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

对吗,因为内存标记为WC --使用[NT]的指令与通常的指令没有什么不同(没有[NT]),而内存标记为WB -- [NT]的指令与它一起工作,就好像它是内存WC一样?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-26 18:33:15

注意:这个答案主要讨论NT商店。https://stackoverflow.com/a/71667987/327083更全面。

当写入内存映射的IO (即: GPU等)时,通常使用NT (非时态)指令,其中内存是严格不可缓存的,并且总是可以直接访问。

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

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

据我所知,您还可以使用带有常规写回内存的NT指令,它不会尝试缓存这些写操作,但也会尝试在它能够填充一行时进行流处理。在写到WB内存的情况下,我会说应用程序非常专门化,您需要知道,在管理它的缓存方面,您可以比CPU做得更好。而且,写入不会立即发生,因此以后读取回的任何内容都会读取陈旧的数据,直到执行合并的写入为止。如果需要刷新任何未完成的组合写入,则需要使用SFENCE指令来管理这一点。

票数 6
EN

Stack Overflow用户

发布于 2016-08-03 11:27:39

但是,在使用非时态指令时,要小心处理器错误,如果需要针对内存屏障(例如锁添加、MFENCE)对它们进行排序。

Errata HSD162,BDM116和SKL079应用,请参阅Haswell/Broadwell/Skylake规范更新。基本上,来自WC内存的非时态MOVNTDQA将绕过Haswell/Broadwell上的锁,您必须使用MFENCE来修复。在Skylake上,它被破坏了,所以来自WC内存的非时态MOVNTDQA将绕过MFENCE,而修复方法是更新Skylake的微码.

票数 4
EN

Stack Overflow用户

发布于 2022-03-29 19:47:40

NT存储在WB内存的大块上很有用。

NT 存储 movntps / movntdq / etc (以及它们的AVX表单vmovntps等)。很好地处理WB内存,像WC内存一样对待它,覆盖区域的内存排序语义,绕过缓存,在LFB中构建完整的64字节数据块,以便在完整写入时发送到内存。(但仍然保持与其他内核的缓存一致性。)是的,WC内存的正常存储也是这样工作的。

如果提前驱逐,在LFB有完整的写操作之前,当写入请求到达内存控制器时,它必须对DDR块进行部分更新。DRAM突发大小为64字节,与缓存线大小相同;这不是巧合。

(SSE2 maskmovdqu有一个NT提示(与AVX vmaskmovps等不同),并导致了同样的问题;也许它在早期的单核CPU上是有效的,并且可以让内存控制器使用字节掩码来写操作,但现在速度很慢。)

如果你想要NT商店订购wrt。正常存储,在完成流(NT)存储到大缓冲区之后,在正常存储其他核心可能读取的标志或指针之前使用sfence (_mm_sfence)。如果您不关心其他内核查看NT存储的顺序(因为您的代码是单线程的),这是不必要的;当前内核总是按照程序顺序查看自己的存储,甚至NT存储。他们最终会把它变成一个内存映射文件或者其他什么的。

NT负载是非常不同的。

SSE4.1 NT load 指令 movntdqa仅在WC内存上特殊,在现有CPU上的WB内存上的movdqa相同,只是16字节对齐所需的加载,但要花费额外的uop。(对于16字节或32字节的操作,vmovntdqa AVX表单也是如此。)NT加载提示在当前CPU上被忽略,指令在体系结构上不允许覆盖内存排序语义;WB内存是强有序的,只有WC是弱有序的,允许负载重排序。

也许因为没有HW预取的加载通常是灾难性的,但是HW prefetch only knows how to do normal prefetches,而不是像prefetchnta这样的NT预取(如果可能的话绕过L3来最小化缓存污染),或者在具有包容性L3缓存(客户端CPU和SKX之前的Xeon )的CPU上,在每组中只使用单一的“方式”。并在预取到L1d时绕过L1d,除非您实际上是从WC内存中预取。从WC内存中,NT预取实际上可以预取到LFB,IIRC。(NT从WC内存负载加载到LFB缓存,如果记忆正确,以后从同一行加载的数据可以从该缓存中提取数据。)有关SW预取的更多细节,请参见Difference between PREFETCH and PREFETCHNTA instructions

英特尔关于将视频RAM复制到主存的白皮书有一些示例和详细信息:https://web.archive.org/web/20120918010837/http://software.intel.com/en-us/articles/increasing-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming-load/

理论上,从WC内存(如movdqu / movdqa或普通整数mov)进行的常规加载允许加载推测,但McCalpin博士报告说,至少在沙桥上,如果存在内存级并行性,实际上不会得到多少。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19035677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档