我正在对VLD3.u8和VLD3.u16进行基准测试,并注意到一个有趣的结果。对于VLD3.u8,输入为1200 * 1048 * 3,对于VLD3.u16,输入为1200 * 1048 * 3 * 2.我将其迭代1000次。
VLD3.u8:2.70秒
VLD3.u16:16.68秒
示例代码
pld [r1, #64]
pld [r1, #64*2]
pld [r1, #64*3]
.loop:
pld [r1, #64*3]
vld3.u8 {d0, d1, d2}, [r1]!
vst3.u8 {d0, d1, d2}, [r0]!
subs r2, r2, #1
bne .loop
pop { r4-r5, pc }
从(http://pulsar.webshaker.net/ccc/result.php?lng=us)查看循环计数器,每个操作需要4个循环(VLD3.u8和VLD3.u16)。
我的期望是VLD3.u16需要两倍的计算时间,因为VLD3.u16的输入是VLD3.u8的两倍。
这是否是VLD3.u16发生缓存未命中问题,导致VLD3.u16花费很长时间将值从ARM寄存器加载到NEON寄存器?
有人可以帮助我:)?