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]
从处理器来看:
这两条指令应该是相关的吧,第二条用到了第一条的结果,为何文档中说第二条可能先于第一条执行完毕?
感谢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达人