代码之家  ›  专栏  ›  技术社区  ›  superKuang

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

  •  0
  • superKuang  · 技术社区  · 12 年前

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

    我认为以下代码不好。是否有更好的实施? (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 回复  |  直到 12 年前
        1
  •  2
  •   fgp    12 年前

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

    但是,如果需要应用此后处理步骤 只对第一列,但对所有列,则可以一次处理8列(如果使用Q寄存器,则为16列),而不是单独处理它们。当然,这有多可行取决于你的算法。

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