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

Cortex-A7 下neon vld指令受memory/cache影响的探讨

在使用汇编优化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}, [r0]!

vld1.32    {d0-d1}, [r1]!
1 个回答 得票排序 · 时间排序
一知半解 · 2020年03月08日

这里的问题和Neon没有直接的关系。因为CPU上不管是Neon还是非Neon都是用的统一的L1 Cache。比较通用的做法是改变你的算法,使得局部性增强,对Cache更友好。举个例子,比如计算矩阵乘法时,如果矩阵太大,导致Cache Miss比较高,那么可以把矩阵拆分成小的再计算以提高Cache Hit。

你的回答