ARM Neon 的使用

Use of ARM Neon

我有点卡住了!我想用 ARM NEON 优化以下代码,但我不确定该怎么做。

uint8_t* srcPtr = src->get();
uint8_t* dstPtr = dst->get();

int i;
for(i=0; i< SIZE; i++){
   dstPtr++ = srcPtr[0];
   dstPtr++ = srcPtr[1];
   dstPtr++ = srcPtr[0];
   dstPtr++ = srcPtr[1];
   dstPtr++ = srcPtr[0];
   dstPtr++ = srcPtr[1];

   srcPtr+= 2;
}

假设 uint8_t 中的 srcPtr 包含

0 1 2 3

dstPtr 将是

0 1 0 1 0 1 2 3 2 3 2 3

有人可以帮我吗?

由于要复制字节对,最简单的做法是将它们视为 16 位值。只要您加载和存储相同的类型,字节顺序并不重要,如果您记得将指针转换为 void* 那么您不必担心编译器添加对齐提示(如果您转换指针到 uint16_t* 然后 Clang 将假定它是一个对齐的指针,并且在某些情况下可能会添加不安全的提示。

由于展开了 3 倍,因此最简单的方法是使用 vst3。如果它是 4 或 8 的因数,那么您可以使用 vdup 代替,但不能用于三倍。

循环体应如下所示:

uint16x4_t v = vld1_u16((void *)src);
uint16x4x3_t v3 = { v, v, v };
vst3_u16((void *)dst, v3);
srcPtr += 8;
dstPtr += 24;