使用 ARM 霓虹灯

Posted

技术标签:

【中文标题】使用 ARM 霓虹灯【英文标题】:Use of ARM Neon 【发布时间】:2017-04-28 02:29:27 【问题描述】:

我有点卡住了!我想用 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】:

由于您要复制成对的字节,最简单的做法是将它们视为 16 位值。只要您加载和存储相同的类型,字节顺序就无关紧要,并且如果您记得将指针转换为void*,那么您不必担心编译器会添加对齐提示(如果您将指针转换为@ 987654322@ 然后 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;

【讨论】:

以上是关于使用 ARM 霓虹灯的主要内容,如果未能解决你的问题,请参考以下文章

arm 霓虹灯比较操作产生负一

我们还需要在运行时使用新的 abi arm64-v8a 检测对霓虹灯的支持吗?

RISC V的任何霓虹灯等效物?

为 iOS 编译半浮动霓虹灯指令

如何在具有霓虹内在函数的多核处理器中有效地使用所有霓虹灯单元

霓虹灯和手臂组装优化