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