В Go 1.27 появился экспериментальный пакет `simd`. Векторный код теперь пишется один раз и работает на AVX, AVX2 и AVX512 на amd64, на NEON на arm64 и на WebAssembly SIMD. Раньше под каждую платформу приходилось держать отдельную реализацию или уходить в ассемблер.
Ширина вектора спрятана от типов. Вместо привычных
Int32x4 или Float64x8 используются типы вроде simd.Float32s и simd.Uint8s. Сколько элементов влезет в регистр, 128, 256 или 512 бит, решает железо, на котором запущена программа. Код от этого не меняется.Набор операций знакомый: загрузка и выгрузка,
Add, Mul, MulAdd, сравнения и маски. В пакет попало только то, что есть на всех платформах, а недостающее эмулируется. Цель авторы формулируют так: писать один раз и получать производительность, близкую к ассемблеру. Компилятор специализирует код под конкретную ширину и убирает накладные расходы на диспетчеризацию внутри вычислений.
Если переносимого набора не хватает, можно спуститься ниже. Методы `ToArch()` и `FromArch()` переводят значения в архитектурно-зависимый пакет
archsimd из Go 1.26, где доступны инструкции конкретного процессора. archsimd поддерживает ещё PowerPC, s390x, RISC-V64 и loong64.Поведение удобно проверять через
GODEBUG. Значение simd=0 включает полную эмуляцию, simd=128, 256 или 512 фиксирует ширину вектора, а вариант с плюсом, например simd=+256, частично включает возможности и паникует на отсутствующих инструкциях. Так можно прогнать тесты на всех ширинах на одной машине.Ограничения тоже есть. В 1.27 нет редукций, поэтому даже сумму элементов вектора придётся собирать обходным путём. В Go 1.28 обещают SVE для ARM, редукции, перестановки элементов,
OnesCount и новые операции с масками. Ещё добавят варианты возможностей, чтобы на железе вроде Raspberry Pi код не откатывался в полную эмуляцию из-за одной недостающей инструкции.Включается всё флагом `GOEXPERIMENT=simd`. Для тех, кто пишет на Go инференс, обработку изображений, кодеки или числодробилки, это первый шанс получить векторизацию без ассемблера и без пачки файлов под каждую архитектуру.
https://go.dev/blog/simd-experiment


