Argon 0.1.0
|
Argon is a library that provides a sane, minimal-overhead C++ interface to ARM's NEON SIMD intrinsics.
Argon grew out of a desire to use C++ abstractions for vector intrinsics, without sacrificing expressiveness or specificity. Most C++ vector libraries (highway, xsimd) abstract away all platform uniqueness in favor of common denominators. When considering the use case of those libraries, namely HPC or multi-platform portability, that's a strength. Unfortunately, when you're targeting a very specific subset of those architectures, or you have one architecture that needs to be optimized above all others, such abstractions fall short.
This is where Argon was created to exist: A NEON-first, others-second zero-overhead abstraction library with modern constructs and capabilities.
Documentation on usage and internal details (generated by Doxygen) can be found here
NEON | MVE | |
---|---|---|
Number of quad-word registers | 16 | 8 |
Narrowing support (see note) | to lower double-word register | to even or odd scalar registers |
Double-word instructions | :heavy_check_mark: | :x: |
64-bit floating point | :heavy_check_mark: | :x: |
Predicated lane instructions | :x: | :heavy_check_mark: |
Native Scatter-Gather | :x: | :heavy_check_mark: |
Backend | Architectures | Status | Notes |
---|---|---|---|
ARM NEON (ARMv7) | VFPv3, VFPv3-FP16, VFPv4 | :white_check_mark: | Primary target |
ARM NEON (ARMv8+) | AArch32, AArch64 | :white_check_mark: | Primary target |
ARM MVE (Helium) | ARMv8.1-M | :warning: | Secondary target (in-progress) |
SIMDe | x86-64(SSE2/AVX), RISCV | :white_check_mark: | Tertiary target, used for portability and testing |
Argon can be compiled using the following tool sets:
Compilers:
Testing is currently done across a range of platforms and compilers, including:
Compiler | ARMv7 | ARMv8 | ARMv8.1-M | X86-64 |
---|---|---|---|---|
GCC | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
Clang | :x: | :heavy_check_mark: | (TBD) | :heavy_check_mark: |
MSVC | :x: | (TBD) | :x: | :heavy_check_mark: |
Compiler | Bare-metal | Linux | macOS | Windows |
---|---|---|---|---|
GCC | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :warning:* |
Clang | :warning:* | :heavy_check_mark: | :warning:** | :heavy_check_mark: |
MSVC | :x: | :x: | :x: | :heavy_check_mark: |
*: Windows/GCC (via MinGW64) and Bare-metal/Clang (via the LLVM Embedded Toolchain for ARM) are used regularly but not tested via CI.
**: In order to compile with Clang on macOS, you'll need to use the brew-bundled versions of libc++, as Apple's system libraries do not support required C++23 features.
Host | ARMv7 | ARMv8 | X86-64 |
---|---|---|---|
Linux | :warning: | :heavy_check_mark: | :heavy_check_mark: |
macOS | :x: | :heavy_check_mark: | :heavy_check_mark: |
Windows | :x: | (TBD) | :heavy_check_mark: |