TGViewer
Golang Golang @golang_google · 40.4K subscribers
Post #3637 7.57K
Go наконец получил переносимый SIMD: один код для x86, ARM и WebAssembly

В 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
  • ❤ 24
  • 🔥 12
  • 👍 7
  • 👏 3
  • 😱 1
More from @golang_google
  1. Sep 30, 2026👣 Для Jev появился Unix-клиент на Go stefafafan/jev - неофициальный provider-neutral CLI…
  2. Sep 27, 2026⚡ Go Concurrency Distilled - конкурентность в Go без воды Компактная мини-книга по concurr…
  3. Sep 24, 2026🔥 SourceCraft научили работать с автономными ИИ-агентами Агенту можно отдать задачу из Gi…
  4. Sep 23, 2026👣 Google открыла исходный код AX, среды для запуска AI-агентов в продакшене. AX изолирует…
  5. Sep 22, 2026👣 webctl: экономный веб-поиск для ИИ-агентов Умная CLI-утилита на Go для поиска в интерне…
  6. Sep 22, 2026Не отставайте от рынка — учитесь со скидкой 16% Если чувствуете, что стоите на месте, и хо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →