Это правильный способ извлечь байт из вектора NEON uint8x16_t? - PullRequest
0 голосов
/ 27 мая 2020

Я новичок во встроенных функциях NEON, и я хотел работать с uint8x16_t, а также uint8x16x4_t. Работая с ним, я столкнулся с ситуацией, когда я хотел извлечь байт из uint8x16_t. Будучи наивным в деталях, я случайно начал извлекать из него байты с помощью оператора [] во время выполнения. Но мой компилятор CLANG успешно скомпилировал код, не выдал никаких ошибок или предупреждений, и я получил желаемый результат.

Я просмотрел справочные руководства ARM и, похоже, никогда не нашел ссылки на использование оператора [] вектор uint8x16_t, ведь это 128-битный регистр, а не массив !? (Пожалуйста, поправьте меня, если я ошибаюсь).

Поэтому, чтобы пролить свет на проблему, я отследил происхождение вектора uint8x16_t в файле заголовка arm_neon.h и нашел следующее:

typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t;
  • Как это хранится в памяти компьютера?

  • Почему я могу использовать оператор [] непосредственно на нем, где я должен использовать:

    uint8_t выборка (uint8x16_t * r, int index) {unsigned char u [16]; vst1q_u8 (и, * г); return u [индекс]; }

    вместо:

    uint8_t fetch (uint8x16_t * r, int index) {return (* r) [index]; } // Это намного быстрее по производительности!

Мы будем благодарны за любую помощь!

1 Ответ

2 голосов
/ 27 мая 2020

Почему я могу использовать оператор [] на нем напрямую

Потому что g cc / clang определяет его в терминах GNU C собственных векторов (https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html), которые имеют четко определенные правила для операторов.

Документы ARM, вероятно, не гарантируют, что [] работает, и, вероятно, есть некоторые компиляторы ARM, которые не работают работает.


Он хранится в памяти (или нет, если только в регистре или оптимизирован) так же, как и любой другой тип. Объект-представление имеет самый низкий элемент по самому низкому адресу. Объекты uint8x16_t во многом похожи на объекты int с точки зрения компилятора, который может решить, где их хранить, и оптимизировать их, et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...