使用ARM Neon

时间:2017-04-28 02:29:28

标签: optimization 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

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:4)

由于您希望复制字节对,因此最简单的方法是将它们视为16位值。只要加载并存储相同的类型,Endianness就无关紧要,如果你记得将指针强制转换为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;