ARMv8-A增加了LDNP/STNP指令,不知指这类指令的应用场景在哪?手册中说这类指令带hint作用,目的是告诉内存系统,所操作的数据不需要入cache,仅单次使用即可,这个怎么理解? 这种类型和device或者SO有何不同呢?
另外DEN0024A_v8_architecture_PG.pdf手册中6-17给出了LDNP指令的一个例子:
For example:
LDR X0, [X3]
LDNP X2, X1, [X0] // Xo may not be loaded when the instruction executes!
To correct the above, you need an explicit load barrier:
DMB nshld
LDNP X2, X1, [X0]
从处理器来看:
这两条指令应该是相关的吧,第二条用到了第一条的结果,为何文档中说第二条可能先于第一条执行完毕?
你好,
就像手册中所说, LDNP/STNP指令提供了这样一种可能性,可以通过使用这些指令告诉CPU的memory system当前的这个load/store操作虽然是针对的cacheable的memory但是可以不被allocate进cache(假设cache miss)。最典型的应用是在某些场合,我们希望读写大片数据但是又不希望这些数据pollute cache里面已经有的数据。Device,S.O.始终都是non-cacheable的,而LDNP/STNP可以让normal memory也有可能变成"non-cacheable",但是如果换成其它的指令,normal memory又可以是cacheable的。注意这些指令在每一个V8 processor中的具体实现可能有细微的差别。
第2个问题是因为对于LDNP/STNP指令,通常的memory ordering rule(只要有dependency, hardware可以保证order)不再适用。即使指令之间有address dependency,软件也必须明确地使用DMB来保证order。
感谢joeyxu的详细回复。在回复中提到“注意这些指令在每一个V8 processor中具体的实现可能有细微差别”。能否以A53和A57为例具体讲一下差别呢? 另外A53属于In-Order,不支持Out of Order,在使用LDNP/STNP时软件是否也必须使用DMB来保证order ?
A53还是会把数据allocate到L2但是不会进L1(注意对于最新版本的A53,默认LDNP/STNP会被当作LDP/STP来执行,可以通过CPUACTLR.DTAH来控制),但是A57通常不会把数据allocate到L1和L2。
第2个问题,in-order是从pipeline角度来说的,但是transaction是由memory system发出来的。即使pipeline是in-order的,processor的memory system发出来的transaction还是有可能是out of order。一个简单的例子,如果数据是bufferable的,可以被写入memory system里的store buffer,这个时候从pipeline角度来看指令就完成了,但是最后发external transaction的时间是由processor drain store buffer的时间来决定的。
大赞joeyxu的专业且精准的回复,使我对LDNP/STNP有一个全面且深入的了解,非常感谢!
joeyxu果然Cortex-A达人