Загрузка 8-битных значений с использованием NEON / ARM - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь загрузить массив значений 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 свойством?

Спасибо!

1 Ответ

6 голосов
/ 27 января 2012

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...