下面代码中“NT”代表Non Temporal,指的是什么?
MOVDQA xmmi, m128
MOVNTDQA xmmi, m128
Non-Temporal SSE指令(MOVNTI,MOVNTQ,etc.) 不遵循普通的cache 一致性的守则,因此这些指令后面需要增加SFENCE以保证它们的结果可以被其他的处理器按照期望的时序看到。 正常的数据,我们如果修改了,存储到cache里,是按照read-modify-write的顺序修改的,如果我们所修改的数据并不会立刻再次被使用,那就没有必要装载到cache里,以免将cache中的有效数据反而victim 出去。这对大型的数据结构比较有效,比如矩阵计算。这时候我们就可以使用non-temporal 类型的指令。 本质上还是这种类型的数据不需要利用cache,反而会破坏cache的性能。 另外,在多线程的情况下,这种类型的store和普通的store,在其他的core看来,顺序并不是该core所见的顺序。当然,该core所见的顺序还是正常的。这时,如果需要让其他的core与当前core所见顺序一样,就需要使用SFECNE。 这恰恰也是需要SFENCE的情况,毕竟正常的write back的X86的指令的store都是in order的,不需要SFENCE保序。
参考链接
欢迎关注我的公众号《处理器与AI芯片》