MCPcopy Create free account
hub / github.com/VcDevel/std-simd

github.com/VcDevel/std-simd @simd-1.0.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release simd-1.0.0 ↗ · + Follow
1,106 symbols 1,677 edges 41 files 35 documented · 3% updated 3y agosimd-1.0.0 · 2019-05-07★ 65622 open issues

Browse by type

Functions 708 Types & classes 398
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

std::experimental::simd

portable, zero-overhead C++ types for explicitly data-parallel programming

This package implements ISO/IEC TS 19570:2018 Section 9 "Data-Parallel Types". It is targetting inclusion into libstdc++. By default, the install.sh script places the std::experimental::simd headers into the directory where the standard library of your C++ compiler (identified via $CXX) resides.

The implementation derives from https://github.com/VcDevel/Vc. It is only tested and supported with GCC 9, even though it may (partially) work with older GCC versions.

Target support

  • x86_64 is the main development platform and thoroughly tested. This includes support from SSE-only up to AVX512 on Xeon Phi or Xeon CPUs.
  • aarch64 was tested and verified to work. No significant performance evaluation was done.
  • ARM NEON in general should work, too.
  • IBM Power support received minimal testing.
  • In any case, a fallback to correct execution via builtin arthmetic types is available for all targets.

Examples

Scalar Product

Let's start from the code for calculating a 3D scalar product using builtin floats:

using Vec3D = std::array<float, 3>;
float scalar_product(Vec3D a, Vec3D b) {
  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}

Using simd, we can easily vectorize the code using the native_simd<float> type:

using std::experimental::native_simd;
using Vec3D = std::array<native_simd<float>, 3>;
native_simd<float> scalar_product(Vec3D a, Vec3D b) {
  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}

The above will scale to 1, 4, 8, 16, etc. scalar products calculated in parallel, depending on the target hardware's capabilities.

For comparison, the same vectorization using Intel SSE intrinsics is more verbose, uses prefix notation (i.e. function calls), and neither scales to AVX or AVX512, nor is it portable to different SIMD ISAs:

using Vec3D = std::array<__m128, 3>;
__m128 scalar_product(Vec3D a, Vec3D b) {
  return _mm_add_ps(_mm_add_ps(_mm_mul_ps(a[0], b[0]), _mm_mul_ps(a[1], b[1])),
                    _mm_mul_ps(a[2], b[2]));
}

Installation Instructions

$ ./install.sh

Use --help to learn about the available options.

Build Requirements

none. It's header-only.

However, to build the unit tests you will need: * cmake >= 3.0 * GCC >= 9.1

To execute all AVX512 unit tests, you will need the Intel SDE.

Building the tests

$ make test

This will create a build directory, run cmake, compile the tests, and execute the tests.

Documentation

https://en.cppreference.com/w/cpp/experimental/simd

Publications

License

The simd headers, tests, and benchmarks are released under the terms of the 3-clause BSD license.

Core symbols most depended-on inside this repo

Shape

Method 400
Class 395
Function 308
Enum 3

Languages

C++100%

Modules by API surface

experimental/bits/simd.h497 symbols
experimental/bits/simd_abis.h347 symbols
experimental/bits/simd_math.h48 symbols
tests/mathreference.h27 symbols
tests/metahelpers.h18 symbols
benchmarks/shifts.cpp18 symbols
experimental/bits/simd_detail.h13 symbols
experimental/bits/simd_debug.h13 symbols
tests/unittest.h12 symbols
tests/conversions.h11 symbols
tests/casts.cpp10 symbols
benchmarks/bench.h10 symbols

For agents

$ claude mcp add std-simd \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page