intel-neon2sse
Библиотека-транслятор, которая позволяет использовать код, написанный для ARM NEON SIMD-инструкций, на архитектурах x86/x86-64 с поддержкой SSE (Streaming SIMD Extensions). Библиотека предоставляет заголовочные файлы, которые преобразуют вызовы функций NEON в эквивалентные SSE-инструкции, что упрощает портирование высокопроизводительного кода между ARM и x86 платформами без необходимости полного переписывания.
Особенности
- преобразует ARM NEON SIMD-инструкции в SSE (SSE2/SSE3/SSE4.1) аналоги на x86;
- позволяет запускать код, написанный для ARM, на x86 без изменений;
- поддерживает большинство распространённых NEON-функций и типов данных;
- требует только заголовочные файлы (header-only), не нуждается в отдельной компиляции;
- совместима с компиляторами GCC, Clang, MSVC;
- упрощает кросс-платформенную разработку для ARM и x86.
Основные компоненты
NEON2SSE состоит из заголовочных файлов, которые предоставляют макросы и функции, эмулирующие поведение ARM NEON с помощью SSE инструкций (подробнее с документацией можно ознакомиться здесь).
Макросы преобразования типов данных
Библиотека определяет набор макросов и типов, которые соответствуют NEON-векторам, но реализованы через SSE-регистры. Это позволяет использовать тот же API, что и в ARM NEON, но на x86 архитектуре.
Основные типы и макросы:
int8x16_t,int16x8_t,int32x4_t,int64x2_t— целочисленные векторы;uint8x16_t,uint16x8_t,uint32x4_t,uint64x2_t— беззнаковые целочисленные векторы;float32x4_t,float64x2_t— векторы с плавающей точкой;vdupq_n_s8(),vdupq_n_u16(),vdupq_n_f32()— инициализация векторов повторяющимся значением;vld1q_s32(),vst1q_s32()— загрузка и сохранение векторов из/в памяти.
Поддержка арифметических операций
Библиотека реализует основные арифметические операции, доступные в NEON, такие как сложение, вычитание, умножение и деление, с использованием соответствующих SSE-инструкций.
Основные арифметические функции:
vaddq_s32(),vsubq_f32(),vmulq_u16()— сложение, вычитание, умножение векторов;vaddvq_s32()— горизонтальное суммирование элементов вектора;vmlaq_f32()— умножение и сложение (fused multiply-add);vabdq_s32()— абсолютная разность;vmaxq_s32(),vminq_f32()— максимум и минимум элементов.
Операции сравнения и логические операции
NEON2SSE преобразует операции сравнения и логические операции NEON в эквивалентные SSE-инструкции, сохраняя семантику работы с векторами.
Функции сравнения и логики:
vceqq_s32(),vcgtq_f32(),vcleq_u16()— операции сравнения (равно, больше, меньше или равно);vandq_s32(),vorrq_u16(),veorq_f32()— побитовые логические операции;vmvnq_s32()— побитовое отрицание (NOT);vbslq_s32()— выбор битов на основе маски (bit select).
Операции сдвига и реорганизации данных
Библиотека поддерживает операции сдвига элементов вектора, а также функции реорганизации данных, такие как перестановки и интерливинг.
Функции сдвига и реорганизации:
vshlq_s32(),vshrq_n_u16()— арифметические и логические сдвиги;vrev64q_s32()— обратный порядок элементов в 64-битных блоках;vtrn1q_s32(),vzip1q_f32()— транспонирование и объединение векторов;vextq_s32()— извлечение части вектора;vtbl1_s8()— табличная замена байтов.
Ограничения и особенности преобразования
Хотя NEON2SSE покрывает большинство распространённых NEON-функций, существуют некоторые ограничения из-за различий между архитектурами NEON и SSE. Важно учитывать эти особенности при портировании кода.
Ключевые ограничения:
- Не все NEON-функции имеют прямые аналоги в SSE, некоторые операции могут быть эмулированы с большими накладными расходами;
- Различия в обработке переполнений и округления могут влиять на результаты;
- Производительность может отличаться от нативного NEON из-за особенностей реализации на SSE;
- Требуется поддержка SSE2 как минимум, для некоторых функций — SSE3, SSE4.1.