如何有效地将垂直线数据从存储器加载到氖寄存器中

时间:2012-09-27 02:35:07

标签: load arm neon

我想从图像块读取垂直数据线,即:我想得到每一行的第一个数据(行长度等于块宽度)。

我认为以下代码并不好。有更好的实施吗? (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 

1 个答案:

答案 0 :(得分:1)

NEON仅直接支持最大4步幅的非连续负载(通过VLDn指令,其中n是步幅大小)。由于你的行长度可能比这大得多,所以除了像代码一样单独加载每个元素外,我没有办法做你想做的事。

但是,如果您需要将此后处理步骤仅应用于第一列,而是应用于所有列,则可以处理8(或16,如果使用Q寄存器)列立刻,而不是单独处理它们。当然,可行性取决于你的算法。

理想情况下,您可以进一步提高块大小,并在一个缓存行中同时处理多个列(大多数ARM上为64,如果元素大小为8位)。否则,如果您的图像有很多行,那么包含第一行的缓存行将在您处理最后一行时从缓存中删除,并且必须重新获取它们以处理下一个块列。