Go 1.27 introduces an experimental, platform-agnostic SIMD (Single Instruction Multiple Data) package designed to make high-performance vector computing accessible without architecture-specific assembly code.

SIMD allows CPUs to perform uniform operations across multiple data elements in a single instruction—for example, adding eight pairs of float64 values simultaneously. This capability can significantly accelerate computationally-intensive tasks including cryptography, data processing, and AI workloads. According to the Go Blog, Go’s Green Tea garbage collector already uses SIMD to speed up memory scanning.
Prior to these new APIs, accessing SIMD from Go required writing assembly code, limiting its use to truly performance-critical kernels. Go 1.26 introduced architecture-dependent SIMD APIs for amd64, while Go 1.27 expanded support to arm64 (NEON) and WebAssembly, then added the new portable simd package.
The fundamental challenge addressed by the new package is vast variation among SIMD architectures. Platforms differ in vector sizes (fixed 128-512 bits on some, variable on others), masking implementations, and supported operations. Arm64 offers both fixed 128-bit NEON vectors and variable-size SVE (128-2048 bits). WebAssembly, PowerPC, and s390x provide 128-bit vectors. AMD64 supports 128, 256, and 512-bit vectors via AVX, AVX2, and AVX512. RISC-V supports unspecified sizes between 128 and 65,536 bits. These differences made writing portable SIMD code “onerous,” according to the announcement.
The new simd package solves this by hiding vector size from the type system and supporting only operations available across all platforms, filling gaps with emulation. The design prioritizes three goals: adequacy for data-processing algorithms, efficiency matching assembly language when operations align with hardware, and readability suitable for human and AI-generated code.
Currently, the simd package supports AVX, AVX2, and AVX512 on amd64; NEON on arm64; and WebAssembly SIMD. On platforms without native SIMD support, all operations are emulated, ensuring code always runs.
Vector types use capitalized plural names like simd.Uint8s and simd.Float32s. Data loads from and stores to slices. The first experimental release includes load, broadcast, store, and arithmetic operations, with limitations—notably lacking a cross-element sum operation, though a ReduceSum function is planned for the next release.
To use the experimental package, developers set the GOEXPERIMENT=simd environment variable.
Key facts
- Go 1.27 introduces an experimental platform-independent SIMD package that abstracts hardware differences across architectures
- SIMD operations can significantly accelerate cryptography, data processing, and AI workloads by performing operations on multiple data elements simultaneously
- Prior to these APIs, accessing SIMD from Go required writing architecture-specific assembly code, limiting its use to performance-critical kernels
- The simd package supports AVX/AVX2/AVX512 on amd64, NEON on arm64, and WebAssembly SIMD, with full emulation on unsupported platforms
- The new package hides vector size from the type system and only supports operations available across all platforms to ensure portability
