在 ARM NEON 中的数组边界上加载向量

Posted

技术标签:

【中文标题】在 ARM NEON 中的数组边界上加载向量【英文标题】:Loading of a vector on the border of the array in ARM NEON 【发布时间】:2015-12-02 11:07:36 【问题描述】:

我尝试使用 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;

【问题讨论】:

【参考方案1】:

我认为以下功能对您的情况有用:

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);

【讨论】:

以上是关于在 ARM NEON 中的数组边界上加载向量的主要内容,如果未能解决你的问题,请参考以下文章

将 NEON 组件与非向量函数混合

ARM NEON Intrinsics:将向量的值限制为 0-255

使用 NEON 在 ARM 汇编中对四字向量中的所有元素求和

ARM NEON:从 NEON 寄存器(Q/D 寄存器)中包含的地址加载数据

如何使用 arm neon 8bit 乘加和到 32 位向量?

如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4 中?