nimble install nimsimd
This repo provides pleasant Nim bindings for various SIMD instructions.
Each SIMD instruction set is in its own file for importing.
Instruction Set | Bindings |
---|---|
SSE | ✅ |
SSE2 | ✅ |
SSE3 | ✅ |
SSSE3 | ✅ |
SSE4.1 | ✅ |
SSE4.2 | ✅ |
AVX | ✅ |
AVX2 | ✅ |
PCLMULQDQ | ✅ |
BMI1 | ✅ |
BMI2 | ✅ |
F16C | ✅ |
MOVBE | ✅ |
MOVBE | ✅ |
POPCNT | ✅ |
FMA | ✅ |
Some instruction sets require additional compiler flags to compile. I suggest
putting any code that uses these instructions into its own .nim file and adding a localPassc
pragma to the top of that file as needed, such as:
import nimsimd/sse42
when defined(gcc) or defined(clang):
{.localPassc: "-msse4.2".}
...
You can also check if instruction sets are available at runtime:
import nimsimd/runtimecheck
echo checkInstructionSets({SSE41, PCLMULQDQ})
NEON bindings are started but experimental. Much to learn here about versioning and compilers.
- Pixie uses SIMD for faster 2D drawing.
- Crunchy uses SIMD for faster hashing and checksums.
- Noisy uses SIMD to accelerate generating coherent noise.
nimble test