1

我正在尝试将 char 值数组加载到 NEON 寄存器中,然后将它们视为 16 位或 32 位整数值。所以像这样的事情......

void SubVector(short* c, const unsigned char* a, const unsigned char* b, int n)
{
    for(int i = 0; i < n; i++)
    {
        c[i] = (short)a[i] - (short)b[i];
    }
}

我不确定如何加载数据。我应该将 8 位数据加载到通道中,然后将寄存器重新解释为短路吗?还是加载和转换?最快的方法是什么?

有没有人举例说明他们如何使用 NEON 内在函数来做到这一点?

谢谢!

4

1 回答 1

6

NEON 具有加法和减法指令,可以将值从 8->16、16->32 或 32->64 位扩展。你可以像这样一次做 8 个:

uint8x8_t u88_a, u88_b;
uint16x8_t u168_diff;

u88_a = vld1_u8(a); // load 8 unsigned chars from a[]
u88_b = vld1_u8(b); // load 8 unsigned chars from b[]
u168_diff = vsubl_u8(u88_a, u88_b); // calculate the difference and widen to 16-bits
于 2012-01-27T17:51:15.983 回答