.NET SIMD & Vectorization

SkillDev tools

Vectorize hot loops in C#/.NET the right way — reach for System.Numerics.Tensors (TensorPrimitives) first, then System.Runtime.Intrinsics (Vector128/256/512) for hand-written algorithms, hardware intrinsics only as a last resort. USE FOR: choosing between TensorPrimitives, Vector<T>, Vector128/256/512, and X86/Arm/Wasm intrinsics; MemoryMarshal/LoadUnsafe/StoreUnsafe span-to-vector patterns; hardware-acceleration checks (IsHardwareAccelerated, IsSupported); widest-vector-first code paths with scalar/small-input fallbacks; masked remainder handling for non-idempotent vs idempotent ops; lane-crossing pitfalls with Vector256/512 horizontal reductions; eliminating bounds checks/branches in scalar/remainder code; multi-core parallelization via Parallel.Invoke chunking over TensorPrimitives calls; testing SIMD paths via DOTNET_Enable* env vars and .runsettings; benchmarking with BenchmarkDotNet job configs. DO NOT USE FOR: GPU compute (CUDA/TorchSharp); SIMD in non-.NET languages.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the .NET SIMD & Vectorization skill

What this skill tells your AI

The instructions your AI receives, as published by netfabric/netfabric.numerics in .agents/skills/dotnet-simd/SKILL.md and read by ahel’s review.

Requires using System.Numerics; / using System.Runtime.Intrinsics; / using System.Numerics.Tensors; (TensorPrimitives, package System.Numerics.Tensors) depending on the step below.

Decision Ladder

Only escalate to the next step when a benchmark shows the current one doesn't cover your case — most code should stop at step 1.

StepAPIWhen
1TensorPrimitives (tensor-primitives.md)Default choice — ~200 ready-made vectorized span operations (arithmetic, math functions, reductions, cosine similarity, ...). Don't hand-roll what's already optimized and tested.
2Vector128<T>/Vector256<T>/Vector512<T> (vector128-vectorization.md)No TensorPrimitives overload covers your exact operation. Recommended starting point for hand-written vectorization — broadest hardware support, fine-grained control.
3Vector<T> (vector-t-and-fixed-shape.md)A quick, simple portable loop where per-width control isn't worth the complexity. Simpler to write than step 2, but less control.
4Platform intrinsics — System.Runtime.Intrinsics.X86/.Arm/.Wasm (hardware-intrinsics.md)A specific processor instruction measurably beats what Vector128/256 generate, on a proven hot path.

Steps 1–2 handle almost everything. General CPU-level techniques for the scalar/remainder code inside a hand-written algorithm (bounds-check elimination, branch removal, multi-accumulator unrolling) and multi-core chunking live in performance-optimization-ladder.md.

Quick Pattern: Reach for TensorPrimitives First

public static float[] MultiplyAdd(float[] left, float[] right, float[] addend)
{
    var result = new float[left.Length];
    TensorPrimitives.Multiply(left, right, result);   // result = left * right
    TensorPrimitives.Add(result, addend, result);     // result += addend (in-place)
    return result;
}

Only drop to hand-written Vector128<T> (see vector128-vectorization.md) when no TensorPrimitives overload exists for your exact operation:

public static T Sum<T>(ReadOnlySpan<T> buffer) where T : unmanaged, INumberBase<T>
{
    if (Vector128.IsHardwareAccelerated && Vector128<T>.IsSupported)
        return buffer.Length >= Vector128<T>.Count ? SumVector128(buffer) : SumVectorSmall(buffer);
    return SumScalar(buffer);
}

Reference Files

FileLoad When
references/tensor-primitives.mdUsing TensorPrimitives/Tensor<T>; deciding when it's not enough
references/vector128-vectorization.mdHand-writing Vector128/256/512 code, hardware-acceleration checks, remainder handling, lane-crossing pitfalls, safe load/store
references/hardware-intrinsics.mdPlatform-specific X86/Arm/Wasm intrinsics as a last resort
references/vector-t-and-fixed-shape.mdVector<T> portable vectorization; Vector2/Vector3/Vector4/Matrix/Quaternion graphics types
references/performance-optimization-ladder.mdBounds-check elimination, branch removal, loop unrolling, multi-core chunking recipes
references/testing-and-benchmarking.mdTesting across Scalar/Vector128/256/512; .runsettings; BenchmarkDotNet job configs

Signals

GitHub stars
36
Forks
1
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
dotnet-simd
Source
github.com/netfabric/netfabric.numerics