Enabling SIMD using codes to build on other architectures using the SIMD Everywhere header only library
Debian source package https://tracker.debian.org/simde produces "libsimde-dev"
Upstream: https://github.com/simd-everywhere/simde
This page documents one option for increasing portability of CPU instruction selection. It can be combined with other features to achieve higher levels of portability for software that is not currently very portable.
When to use
C/C++ codebase makes reference to {m,xm,em,pm,tm,sm,nm,im}mintrin.h or x86intrin.h and does not provide other code routes for non-X86 architectures
Note: As of 2021-01-27 (SIMDe v0.7.2) there is complete coverage of MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, FMA, GFNI, CLMUL, XOP, and SVML. The AVX512 variants are in progress still. Adding new functions is easy if you have access to the real hardware that supports them: https://github.com/simd-everywhere/simde#contributing
Approach
- Add libsimde-dev to the Build-Depends in debian/control
- Create a new patch to modify any source file that references the non portable headers.
Add #define SIMDE_ENABLE_NATIVE_ALIASES prior to the "simde" include; use the table below to help pick the right portable header to include.
non-portable header
portable header
#include <mmintrin.h>
#include <simde/x86/mmx.h>
#include <xmmintrin.h>
#include <simde/x86/sse.h>
#include <emmintrin.h>
#include <simde/x86/sse2.h>
#include <pmmintrin.h>
#include <simde/x86/sse3.h>
#include <tmmintrin.h>
#include <simde/x86/ssse3.h>
#include <smmintrin.h>
#include <simde/x86/sse4.1.h>
#include <nmmintrin.h>
#include <simde/x86/sse4.2.h>
#include <immintrin.h>
#include <simde/x86/avx.h>
#include <immintrin.h>
#include <simde/x86/fma.h>
#include <immintrin.h>
#include <simde/x86/avx2.h>
#include <immintrin.h>
#include <simde/x86/avx512.h>
#include <x86intrin.h>
#include <simde/x86/avx512.h>
- Modify debian/rules to add "-DSIMDE_ENABLE_OPENMP -fopenmp-simd" along with "-O3" to CFLAGS/CXXFLAGS if that isn't already defined:
export DEB_CFLAGS_MAINT_APPEND+=-DSIMDE_ENABLE_OPENMP -fopenmp-simd -O3 export DEB_CXXFLAGS_MAINT_APPEND+=-DSIMDE_ENABLE_OPENMP -fopenmp-simd -O3
Be sure to remove any -msse3, -march=native or similar from upstream's build system, if needed
Be mindful of Debian Policy 7.8: if the source package requires the full source code be available (like the GPL) then you'll need to add Built-Using to indicate which version of libsimde-dev was used.
Add Built-Using: ${simde:Built-Using} to the appropriate binary package(s) in debian/control
In debian/rules add
override_dh_gencontrol: dh_gencontrol -- -Vsimde:Built-Using="$(shell dpkg-query -f '$${source:Package} (= $${source:Version}), ' -W "libsimde-dev")"
- Resulting binaries should now be building everywhere, though you may still have issues with 32-bit architectures and/or big-endian systems.
Bonus: on i386/amd64 the architecture baseline should no longer be violated. For applications using "simde" consider compiling multiple times on i386 & amd64 all applicable SIMD compilation flags and adding a dispatching script to pick the highest available version at runtime.
Example: simd-dispatch script & debian/rules
- Libraries using this technique will benefit from a built in CPU feature dispatcher, but that is more advanced.
- Once the package builds on more architectures successfully, please discuss with upstream about adopting this or another technique.
- Add your package as an example to the lists below.
Packages Status
As of 2023-01-22, here is an incomplete list of packages that are using this technique, either due to Debian patches, or natively.
Package |
Native or Debian use of SIMDe? |
Patches sent upstream? |
Notes |
Debian patches |
|
||
Debian patches |
|
||
Native SIMDe |
N/A |
code-copy of libssw 0.1.4 |
|
Debian patches |
code-copy of ksw2 |
||
Native SIMDe |
N/A |
code-copy of libssw 1.2 |
|
Debian patches |
|
||
Native SIMDe |
N/A |
|
|
Debian patches |
code copy of ksw.c |
||
Native SIMDe |
N/A |
|
|
Debian patches |
|
||
Native SIMDe |
N/A |
|
|
Native SIMDe |
N/A |
|
|
Native SIMDe |
N/A |
code copy of ksw.c |
|
Native SIMDe |
N/A |
|
|
Debian patches |
|
||
Native SIMDe |
N/A |
|
|
Native SIMDe |
N/A |
|
|
Debian patches |
|
||
Native SIMDe |
N/A |
|
|
Native SIMDe |
N/A |
|
|
Native SIMDe |
N/A |
||
Native SIMDe |
N/A |
|
|
Native SIMDe |
N/A |
|
|
Debian patches |
|
||
Native SIMDe |
N/A |
|
|
Debian patches |
Code copy of ksw2 |
||
Debian Patches |
|
||
Debian Patches |
|
||
Debian Patches |
|
||
Native SIMDe |
|
Embeds mmseqs |
Candidate packages
Some can be found via apt-cache rdepends sse2-support or similar
iqtree AMD64 & i386 package is -msse3 ; AMD64 package is also -mavx (violates the ABI); no non-x86 packages
pufferfish (not yet in Debian) (code copy of ksw2)
salmon (code copy of ksw2) Upstream just added SIMDe on their own, check for a future release.
sptag patch prepared but it requires additional AVX512 support and other fixes in SIMDe