0

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

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

1 回答 1

1

NEON 仅直接支持步幅最大为 4 的非连续加载(通过 VLDn 指令,其中 n 是步幅大小)。由于您的行长可能比这大得多,除了像您的代码代码那样单独加载每个元素之外,我看不到其他方法可以做您想做的事情。

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

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

于 2012-09-27T10:55:57.193 回答