潮声隔雨深 · 2020年03月01日

pld offset疑问

在翻看了pld文档,又百度后,对于 PLtype{cond} [Rn {, #offset}] 这个后面的offset 不理解,到底指的是byte 还是bit了

类似于下面这段代码, 想理解 pld [r1,#0xc0] 这个是希望将r1指向的后面192个字节加载到cache line当中,还是指的是192bit相应的24字节加载到cache line当中

而后面的 subs r2,r2,#0x40,表达 的是上面的64字节进行了复制,不太理解,如果是pld后面的那个0XC0是字节的话,为什么,不一次预加载128个字节,这样,每次预加载后

第二次在使用的时候,前一次已经有64字节一半在里面了。为什么是192字节效率最高,如果是代表bit的话,为啥是预加载24字节,按理说一次是加载一个cache line 64字节才对

还有一个pld,一般情况下会吃几个cycle cpu呢, 想写一个性能好的点积。求指教

NEONCopyPLD
PLD [r1, #0xC0]
VLDM r1!,{d0-d7}
VSTM r0!,{d0-d7}
SUBS r2,r2,#0x40
BGE NEONCopyPLD

1 个回答 得票排序 · 时间排序
一知半解 · 2020年03月01日

PLD的offset是byte。它和Rn组成一个地址。地址都是以byte为单位的。

192字节是一个经验数据。可能在不同的CPU上可能会不太一样。有一个准则是这个offset不能太小。因为太小的话,比如64字节,那么当PLD指令的预加载生效时(如果是从L2 Cache里面加载数据,那也需要几十个Cycle。这个不同CPU不一样。比如 https://www.7-cpu.com/cpu/Cor...),下面的VLDM指令已经运行完毕了。这个预加载的64字节也就没有用到。

你的回答