NT在写入内存映射IO(即:GPU等)时,通常会使用(非时间)指令,其中内存严格不可缓存,并且始终直接访问.
通过定期读取和写入,CPU将在需要时尝试缓存并将更大的块写入主存储器.对于不可缓存的区域(例如MMIO),写入必须直接进入内存,CPU不会尝试缓存它们.使用NT指令提示CPU可能会传输大量数据(例如:到帧缓冲区等),当它可以填充整个缓存行时,它会尝试组合这些写入.
"非暂时"部分意味着您告诉CPU您不打算立即发生写入,但可以在合理范围内延迟写入,直到NT发出足够的指令来填充缓存行.
据我所知,您也可以使用NT带有常规回写内存的指令,它不会尝试缓存这些写入,但也会尝试在填充行时进行流式处理.在写入WB内存的情况下,我会说应用程序非常专业,你需要知道在管理缓存时你可以比CPU做得更好.此外,写入不会立即发生,因此之后回读的任何内容都会读取过时的数据,直到执行组合写入为止.SFENCE如果需要刷新任何未完成的组合写入,则需要使用说明对此进行管理.
最好直接从英特尔阅读 - 他们有很多关于这个主题的信息:
使用英特尔®SIMD流指令扩展4(英特尔®SSE4)流加载,提高内存吞吐量