
Go 1.27 додав експериментальний SIMD-інтерфейс, незалежний від платформи
Команда Go представила експериментальний пакет simd, який приховує відмінності між архітектурами процесорів. Векторний код тепер пишуть один раз і запускають будь-де, а на платформах без апаратної підтримки операції емулюються.
У Go 1.27 з'явився експериментальний інтерфейс SIMD, який поводиться однаково на різних архітектурах процесорів. Про це написали Девід Чейз і Джуньян Шао з команди Go у блозі 24 вересня 2026 року. Досі розробникам доводилося писати асемблерний код або користуватися архітектурно-залежними API з Go 1.26 і Go 1.27.
SIMD дозволяє одній інструкції працювати з цілим вектором значень, наприклад додавати вісім пар чисел float64 за раз. Це прискорює криптографію, обробку даних і задачі AI, а збирач сміття Green Tea у Go вже застосовує SIMD для пошуку живих об'єктів у пам'яті.
Портативний шар над archsimd
У Go 1.26 додали SIMD API для amd64, а в Go 1.27 додали API для arm64 (NEON) і wasm. Ці API живуть в archsimd, пакеті, залежному від архітектури, адже платформи різняться не лише набором операцій, а й поданням векторів: одні мають фіксований розмір від 128 до 512 бітів, інші повідомляють його лише на старті програми.
Новий пакет simd, частково натхненний Highway для C++, прибирає фіксовані вектори із системи типів і підтримує тільки ті операції, що є на всіх платформах, а прогалини заповнює емуляцією з інших SIMD-інструкцій. Векторні типи — це звичайні примітиви з великої літери й у множині, як-от simd.Uint8s або simd.Float32s, які завантажують зі зрізів. Порівняння повертають маски, прив'язані до ширини елемента: Int8s дає Mask8s. Метод ToArch() перетворює вектор на платформний тип, а вмикають усе через GOEXPERIMENT=simd.
Чим платформи різняться
wasm, PowerPC і s390x мають один фіксований розмір вектора (128 бітів), amd64 пропонує три, loong64 два. Довжина векторів RISC-V невідома під час збирання, arm64 поєднує фіксований 128-бітний NEON зі змінним SVE, а маскування працює трьома способами: векторні бітмаски, окремі регістри масок або один біт маски на байт вектора.
Емуляція та диспетчеризація
Багато прогалин закривають дві-три інструкції: скалярні зсуви емулюють векторними, а відсутні беззнакові порівняння зводяться до знакового порівняння плюс два XOR з константою. Множення без перенесення, важливе для криптографії та контрольних сум CRC, емулюється за сталий час, а на апаратурі без SIMD емулюються всі операції, тож код усе одно працює.
Параметри GODEBUG дозволяють тестувати код під конкретні конфігурації: simd=0 примусово вмикає емуляцію, simd=128, 256 і 512 обирають ширину вектора й спричиняють паніку, якщо функцій бракує, а форми +128, +256 і +512 терплять відсутні можливості, як на Raspberry Pi (NEON без PMULL). Переписування AST у фронтенді компілятора спеціалізує функції зі згадкою типів simd і загортає решту в обгортки, що перемикаються за виявленим під час запуску рівнем SIMD, тож диспетчеризації на кожну операцію немає.
Що далі
У Go 1.28 планують додати операції OnesCount, маскові, редукційні та операції перестановки векторів, підтримку SVE для archsimd і, сподіваємося, для simd, а також кілька варіантів функцій, які не дають впасти до повної емуляції на машинах, де бракує лише однієї-двох інструкцій. З'явиться й ReduceSum, що замінить ручний цикл збереження й додавання, потрібний у поточному API.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.