【问题标题】:Use of ARM Neon使用 ARM 霓虹灯
【发布时间】: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

有人可以帮帮我吗?

【问题讨论】:

    标签: optimization arm neon


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多