C++ wrappers for SIMD intrinsics.

# Introduction

SIMD (Single Instruction, Multiple Data) is a feature of microprocessors that has been available for many years. SIMD instructions perform a single operation on a batch of values at once, and thus provide a way to significantly accelerate code execution. However, these instructions differ between microprocessor vendors and compilers.

xsimd provides a unified means for using these features for library authors.

The core of the library consist in a parametrized vector type, Batch Types, and a set of operations to perform Arithmetic Operations, Data Transfers, and many common mathemtical functions, as for single values.

There are several ways to use xsimd using those Batch Types and operations:

- one can write a generic, vectorized, algorithm and compile it as part of their application build, with the right architecture flag;

- one can write a generic, vectorized, algorithm and compile several version of it by just changing the architecture flags, then pick the best version at runtime;

- one can write a vectorized algorithm specialized for a given architecture and still benefit from the high-level abstraction proposed by xsimd.

Of course, nothing prevents the combination of several of those approach, but more about this in section Writing Vectorized Code.

You can find out more about this implementation of C++ wrappers for SIMD intrinsics at the The C++ Scientist. The mathematical functions are a lightweight implementation of the algorithms also used in boost.SIMD.

# Compiler and Architecture Support

The following SIMD instruction set extensions are supported:

Architecture | Instruction set extensions
--- | ---
x86 | SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, FMA3, AVX2
x86 | AVX512 (gcc7 and higher)
x86 AMD | same as above + FMA4
ARM | ARMv7, ARMv8
WebAssembly | WASM
Risc-V | Vector ISA
PowerPC | VSX

xsimd requires a C++11 compliant compiler. The following C++ compilers are supported:

Compiler | Version
--- | ---
Microsoft Visual Studio | MSVC 2015 update 2 and above
g++ | 4.9 and above
clang | 3.7 and above

# Licensing

We use a shared copyright model that enables all contributors to maintain the copyright on their contributions.

This software is licensed under the BSD-3-Clause license. See the LICENSE file for details.

INSTALLATION

- Installation
  - Using the conda-forge Package
  - Using the Spack Package
  - From Source with cmake

USAGE

- Basic Usage
  - Manipulating Abstract Batches
  - Manipulating Parametric Batches
  - Explicit Use of an Instruction Set Extension
- Writing Vectorized Code
  - Explicit Use of an Instruction Set
  - Aligned vs Unaligned Memory
  - Memory Alignment and Tag Dispatching
  - Writing Arch-Independent Code
- Integration
  - When Targeting a Single Architecture
  - When Targeting Multiple Architectures

API REFERENCE

- Instruction Set Macros
- Batch Types
- Data Transfers
- Arithmetic Operations
- Comparison Operators
- Bitwise Operators
- Mathematical Functions
- Reduction Operators
- Type Conversion
- Type Traits
- Conditional Expression
- Miscellaneous
- Alignment Manipulation
- Architecture Manipulation
- Arch Dispatching

MIGRATION GUIDE

- From 7.x to 8.x