在ARM NEON中的阵列边界上加载矢量

Loading of a vector on the border of the array in ARM NEON

本文关键字:加载 边界 阵列 ARM NEON      更新时间:2023-10-16

我尝试使用NEON内部函数优化ARM的一些图像处理算法。对于某些过滤器,它需要加载点附近的元素。例如,为了对像素p[x]中的图像进行滤波,我需要加载p[x - 1]p[x]p[x + 1]。如果是x=0,则我加载p[0]p[0]p[1]。如果是x=width-1,则我加载p[width-2]p[width-1]p[width-1]

所以如果我有一个矢量:

uint8x16_t a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

我如何从中获得以下矢量:

uint8x16_t b = {0, 0, 1, 2, 3, 4, 5, 6, 7,  8,  9, 10, 11, 12, 13, 14};
uint8x16_t c = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15};

我认为以下函数将对您的情况有用:

template <size_t count> inline uint8x16_t LoadBeforeFirst(uint8x16_t first)
{
    return vextq_u8(vextq_u8(first, first, count), first, 16 - count);
}
template <size_t count> inline uint8x16_t LoadAfterLast(uint8x16_t last)
{
    return vextq_u8(last, vextq_u8(last, last, 16 - count), count);
}