A C/C++ header file that converts Intel SSE intrinsics to Arm/Aarch64 NEON intrinsics.
sse2neon
is a translator of Intel SSE (Streaming SIMD Extensions) intrinsics
to Arm NEON,
shortening the time needed to get an Arm working program that then can be used to
extract profiles and to identify hot paths in the code.
The header file sse2neon.h
contains several of the functions provided by Intel
intrinsic headers such as <xmmintrin.h>
, only implemented with NEON-based counterparts
to produce the exact semantics of the intrinsics.
Header file | Extension |
---|---|
<mmintrin.h> |
MMX |
<xmmintrin.h> |
SSE |
<emmintrin.h> |
SSE2 |
<pmmintrin.h> |
SSE3 |
<tmmintrin.h> |
SSSE3 |
<smmintrin.h> |
SSE4.1 |
<nmmintrin.h> |
SSE4.2 |
<wmmintrin.h> |
AES |
sse2neon
aims to support SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AES extension.
In order to deliver NEON-equivalent intrinsics for all SSE intrinsics used widely, please be aware that some SSE intrinsics exist a direct mapping with a concrete NEON-equivalent intrinsic. However, others lack of 1-to-1 mapping, that means the equivalents are implemented using several NEON intrinsics.
For example, SSE intrinsic _mm_loadu_si128
has a direct NEON mapping (vld1q_s32
),
but SSE intrinsic _mm_maddubs_epi16
has to be implemented with 13+ NEON instructions.
-
Put the file
sse2neon.h
in to your source code directory. -
Locate the following SSE header files included in the code:
#include <xmmintrin.h>
#include <emmintrin.h>
{p,t,s,n,w}mmintrin.h should be replaceable, but the coverage of these extensions might be limited though.
- Replace them with:
#include "sse2neon.h"
- Explicitly specify platform-specific options to gcc/clang compilers.
- On ARMv8-A targets, you should specify the following compiler option: (Remove
crypto
and/orcrc
if your architecture does not support cryptographic and/or CRC32 extensions)
-march=armv8-a+fp+simd+crypto+crc
- On ARMv7-A targets, you need to append the following compiler option:
-mfpu=neon
- On ARMv8-A targets, you should specify the following compiler option: (Remove
Considering the balance between correctness and performance, sse2neon
recognizes the following compile-time configurations:
SSE2NEON_PRECISE_MINMAX
: Enable precise implementation of_mm_min_ps
and_mm_max_ps
. Turned off by default. If you need consistent results such as NaN special cases, define the macro as1
before includingsse2neon.h
.
sse2neon
provides a unified interface for developing test cases. These test
cases are located in tests
directory, and the input data is specified at
runtime. Use the following commands to perform test cases:
$ make check
You can specify GNU toolchain for cross compilation as well. QEMU should be installed in advance.
$ make CROSS_COMPILE=aarch64-linux-gnu- check # ARMv8-A
or
$ make CROSS_COMPILE=arm-linux-gnueabihf- check # ARMv7-A
Once the conversion is implemented, the test can be added with the following steps:
-
File
tests/impl.h
Add the intrinsic under
#define INTRIN_FOREACH(TYPE)
macro. The naming convention should bemm_xxx
. Place it in the correct classification with the alphabetical order. The classification can be referenced from Intel Intrinsics Guide. -
File
tests/impl.cpp
result_t test_mm_xxx() { // The C implementation ... // The Neon implementation ret = _mm_xxx(); // Compare the result of two implementations and return either // TEST_SUCCESS, TEST_FAIL, or TEST_UNIMPL ... }
Use the command $ make indent
to follow the coding convention.
Here is a partial list of open source projects that have adopted sse2neon
for Arm/Aarch64 support.
- Apache Impala is a lightning-fast, distributed SQL queries for petabytes of data stored in Apache Hadoop clusters.
- Apache Kudu completes Hadoop's storage layer to enable fast analytics on fast data.
- ART is an implementation in OCaml of Adaptive Radix Tree (ART).
- Boo is a cross-platform windowing and event manager similar to SDL or SFML, with additional 3D rendering functionality.
- Catcoon is a feedforward neural network implementation in C.
- dab-cmdline provides entries for the functionality to handle Digital audio broadcasting (DAB)/DAB+ through some simple calls.
- emp-tool aims to provide a benchmark for secure computation and allowing other researchers to experiment and extend.
- FoundationDB is a distributed database designed to handle large volumes of structured data across clusters of commodity servers.
- iqtree_arm_neon is the Arm NEON port of IQ-TREE, fast and effective stochastic algorithm to infer phylogenetic trees by maximum likelihood.
- kram is a wrapper to several popular encoders to and from PNG/KTX files with LDR/HDR and BC/ASTC/ETC2.
- libscapi stands for the "Secure Computation API", providing reliable, efficient, and highly flexible cryptographic infrastructure.
- minimap2 is a versatile sequence alignment program that aligns DNA or mRNA sequences against a large reference database.
- MMseqs2 (Many-against-Many sequence searching) is a software suite to search and cluster huge protein and nucleotide sequence sets.
- N2 is an approximate nearest neighborhoods algorithm library written in C++, providing a much faster search speed than other implementations when modeling large dataset.
- niimath is a general image calculator with superior performance.
- OBS Studio is software designed for capturing, compositing, encoding, recording, and streaming video content, efficiently.
- OGRE is a scene-oriented, flexible 3D engine written in C++ designed to make it easier and more intuitive for developers to produce games and demos utilising 3D hardware.
- OpenXRay is an improved version of the X-Ray engine, used in world famous S.T.A.L.K.E.R. game series by GSC Game World.
- parallel-n64 is an optimized/rewritten Nintendo 64 emulator made specifically for Libretro.
- PFFFT does 1D Fast Fourier Transforms, of single precision real and complex vectors.
- PlutoSDR Firmware is the customized firmware for the PlutoSDR that can be used to introduce fundamentals of Software Defined Radio (SDR) or Radio Frequency (RF) or Communications as advanced topics in electrical engineering in a self or instructor lead setting.
- Pygame is cross-platform and designed to make it easy to write multimedia software, such as games, in Python.
- simd_utils is a header-only library implementing common mathematical functions using SIMD intrinsics.
- Spack is a multi-platform package manager that builds and installs multiple versions and configurations of software.
- srsLTE is an open source SDR LTE software suite.
- Surge is an open source digital synthesizer.
- XMRig is an open source CPU miner for Monero cryptocurrency.
- SIMDe: fast and portable implementations of SIMD intrinsics on hardware which doesn't natively support them, such as calling SSE functions on ARM.
- SSE2NEON.h : A porting guide and header file to convert SSE intrinsics to their ARM NEON equivalent
- CatBoost's sse2neon
- ARM_NEON_2_x86_SSE
- SSE2NEON - High Performance MPC on ARM
- AvxToNeon
- POWER/PowerPC support for GCC contains a series of headers simplifying porting x86_64 code that
makes explicit use of Intel intrinsics to powerpc64le (pure little-endian mode that has been introduced with the POWER8).
- implementation: xmmintrin.h, emmintrin.h, pmmintrin.h, tmmintrin.h, smmintrin.h
- Intel Intrinsics Guide
- Arm Neon Intrinsics Reference
- Neon Programmer's Guide for Armv8-A
- NEON Programmer's Guide
- qemu/target/i386/ops_sse.h: Comprehensive SSE instruction emulation in C. Ideal for semantic checks.
sse2neon
is freely redistributable under the MIT License.