使用 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 霓虹灯的主要内容,如果未能解决你的问题,请参考以下文章
我们还需要在运行时使用新的 abi arm64-v8a 检测对霓虹灯的支持吗?