我想从图像块读取垂直数据线,即:我想得到每一行的第一个数据(行长度等于块宽度)。
我认为以下代码并不好。有更好的实施吗? (r5中的数据地址,r1中的行长度)
vld1.u8 d3[0], [r5], r1
vld1.u8 d3[1], [r5], r1
vld1.u8 d3[2], [r5], r1
vld1.u8 d3[3], [r5], r1
vld1.u8 d3[4], [r5], r1
vld1.u8 d3[5], [r5], r1
vld1.u8 d3[6], [r5], r1
vld1.u8 d3[7], [r5], r1
vld1.u8 d4[0], [r5], r1
vld1.u8 d5[0], [r5], r1
vld1.u8 d5[1], [r5], r1
vld1.u8 d5[2], [r5], r1
vld1.u8 d5[3], [r5], r1
vld1.u8 d5[4], [r5], r1
vld1.u8 d5[5], [r5], r1
vld1.u8 d5[6], [r5], r1
vld1.u8 d5[7], [r5], r1
答案 0 :(得分:1)
NEON仅直接支持最大4步幅的非连续负载(通过VLDn指令,其中n是步幅大小)。由于你的行长度可能比这大得多,所以除了像代码一样单独加载每个元素外,我没有办法做你想做的事。
但是,如果您需要将此后处理步骤不仅应用于第一列,而是应用于所有列,则可以处理8(或16,如果使用Q寄存器)列立刻,而不是单独处理它们。当然,可行性取决于你的算法。
理想情况下,您可以进一步提高块大小,并在一个缓存行中同时处理多个列(大多数ARM上为64,如果元素大小为8位)。否则,如果您的图像有很多行,那么包含第一行的缓存行将在您处理最后一行时从缓存中删除,并且必须重新获取它们以处理下一个块列。