使用标记为WB (写回)和WC (写合并)的内存的指令之间的主要区别是什么:MOVDQA
和MOVNTDQA
有什么不同,VMOVDQA
和VMOVNTDQ
有什么不同?
对吗,因为内存标记为WC --使用[NT]
的指令与通常的指令没有什么不同(没有[NT]
),而内存标记为WB -- [NT]
的指令与它一起工作,就好像它是内存WC一样?
发布于 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
指令来管理这一点。
发布于 2016-08-03 11:27:39
但是,在使用非时态指令时,要小心处理器错误,如果需要针对内存屏障(例如锁添加、MFENCE)对它们进行排序。
Errata HSD162,BDM116和SKL079应用,请参阅Haswell/Broadwell/Skylake规范更新。基本上,来自WC内存的非时态MOVNTDQA将绕过Haswell/Broadwell上的锁,您必须使用MFENCE来修复。在Skylake上,它被破坏了,所以来自WC内存的非时态MOVNTDQA将绕过MFENCE,而修复方法是更新Skylake的微码.
发布于 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博士报告说,至少在沙桥上,如果存在内存级并行性,实际上不会得到多少。
https://stackoverflow.com/questions/19035677
复制相似问题