This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

ARMv8-A中如何正确使用LDNP/STNP指令?


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:

LDR X0, [X3]

DMB nshld

LDNP X2, X1, [X0]

从处理器来看:

LDR X0, [X3]

LDNP X2, X1, [X0]

这两条指令应该是相关的吧,第二条用到了第一条的结果,为何文档中说第二条可能先于第一条执行完毕?

Parents
  • 你好,

    就像手册中所说, 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。

Reply
  • 你好,

    就像手册中所说, 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。

Children