在使用汇编优化neon时,发现一个问题:
假设函数的输入两个参数x[2048],y[2048],那么x,y的首地址是不连续的
当在汇编中只读x的数据时所用时间明显比即读取x,也读取y的数据要长很多,我猜想是由于cache没有高效利用的原因,即造成了hit miss的现象,有什么方法可以尽可能的利用cache呢?
汇编代码如下:
只读取x
vld1.32 {d0-d1}, [r0]!
vld1.32 {d2-d3}, [r0]!
读取x,y
vld1.32 {d0-d1}, [r1]!
这里的问题和Neon没有直接的关系。因为CPU上不管是Neon还是非Neon都是用的统一的L1 Cache。比较通用的做法是改变你的算法,使得局部性增强,对Cache更友好。举个例子,比如计算矩阵乘法时,如果矩阵太大,导致Cache Miss比较高,那么可以把矩阵拆分成小的再计算以提高Cache Hit。