出来事の日付:2026年9月25日。

Go 1.27は、単一命令・複数データ処理のための実験的なプラットフォーム非依存インターフェースを追加する。大半の開発者がアセンブリを書いたり、アーキテクチャごとに別の実装を維持したりせずにCPUのベクトル演算ハードウェアを使えるようにする、同言語の取り組みを広げるものだ。

SIMD命令は、複数の値に対して同じ演算を同時に実行する。暗号処理、データ処理、人工知能などのワークロードを高速化でき、GoはすでにGreen Teaガベージコレクターで、メモリーを走査するためにベクトル演算を使っている。最近の実験的導入までは、Goのプログラムがこのハードウェアにアクセスするには通常アセンブリが必要で、その負担のため、特に性能が重要なコードに利用が限られていた。

Go 1.26は、amd64向けの実験的なSIMD APIを導入した。Go 1.27では、アーキテクチャ固有の`archsimd`の方式をArm64 NEONとWebAssemblyへ広げる一方、より高水準の`simd`パッケージも導入する。移植可能な層は現在、amd64上のAVX、AVX2、AVX-512、Arm64上のNEON、およびWebAssemblyのSIMD命令を対象としている。対応する命令を利用できない場合は演算をエミュレートし、同じプログラムを実行できるようにする。

この抽象化が対応するのは、命令名の違いにとどまらない。プロセッサーの系列ごとにベクトル幅は異なり、128ビット固定の形式から、複数の固定サイズを持つもの、実行時にベクトル長が決まるハードウェアまである。RISC-Vでは対応サイズが異なるベクトルが提供され得るほか、ArmのSVEも可変長を使用する。マスキング、並べ替え、暗号演算にも違いがある。基本的な機能にもばらつきがあり、例えばWebAssemblyには64ビット整数のベクトルを比較する演算がない。

Goの移植可能なパッケージは、型システムから固定のベクトルサイズを取り除き、各プラットフォームに共通する演算を提供する。一部の不足は、ほかのSIMD命令で補う。型には`simd.Uint8s`や`simd.Float32s`のように基本型名の複数形を使い、プログラムはスライスからベクトルを読み込み、結果をそこに書き戻す。比較によって要素幅に合ったマスク値が作られ、プログラムはそれを使ってレーンを選択したり絞り込んだりできる。開発者はビルド時に`GOEXPERIMENT=simd`を指定し、実験機能を有効にする。

初期のインターフェースは、意図的に機能を限定している。Go 1.27にはベクトル内の要素を横断して合計する演算は含まれていないが、Goチームは次のリリースで`ReduceSum`を予定しているとしている。移植可能な層にない演算が必要なコードでは、アーキテクチャ固有の表現に変換し、対象ごとに特殊な処理を実装してから、元の表現に戻すことができる。この抜け道によって、アルゴリズム全体を重複して実装せずに、プラットフォーム固有の機能へアクセスできる。

このAPIは引き続き実験段階にあり、安定版として採用されるまでに形が変わる可能性がある。それでも目標は重要だ。単一のGo実装からアセンブリに近いベクトル演算性能を得ると同時に、対応するSIMD機能がないマシンではエミュレーションによって同じ機能を実現することを目指している。