Go 推出平台無關 SIMD 實驗:寫一次、跨架構加速

Go 官方部落格於 2026 年 9 月 24 日發表文章,介紹 Go 1.26 與 1.27 的實驗性 SIMD(單指令多資料)API,以及 1.27 新增的跨平台 simd 套件。文章由 David Chase 與 Junyang Shao 撰寫。[1]

背景

官方指出,SIMD 是現代處理器的原生能力,可對資料向量執行一致運算,例如以單一指令完成八對 float64 值的加法,能顯著加速運算密集型工作,由密碼學、資料處理到人工智能都受惠;Go 自家的 Green Tea 垃圾回收器亦以 SIMD 加速掃描記憶體中的存活物件。[1][2]

在此之前,Go 開發者若要用 SIMD,只能撰寫 Go 組譯;由於成本高,只有真正效能關鍵的運算核心才會採用,結果大量可用 SIMD 的軟件白白浪費中央處理器能力。[1]

Go 1.26 為 amd64 引入 SIMD API,Go 1.27 再加入 arm64(NEON)與 wasm 的 API。但官方指出,SIMD API 的根本難題在於各平台差異極大:不只支援的操作不同,連向量表示方式也不同——部分平台提供 128 至 512 位元的固定長度向量,另一些平台的向量大小在編譯期未知,須在程式啟動時查詢。為完整存取這些平台的能力,相關 API 放在依架構而定的 archsimd 套件。[1]

新套件與設計取捨

Go 1.27 在依架構 API 之外,推出實驗性、完全可攜、與平台及向量大小無關的 SIMD 介面,設計上參考 C++ 的 Highway。官方目標是讓「寫一次」的程式碼達到接近組譯的效能,並在尚未支援 SIMD 的平台上提供稱職的模擬。simd 套件目前支援 amd64 的 AVX、AVX2、AVX512,arm64 的 NEON,以及 wasm 的 SIMD 指令。[1]

官方解釋 simd 套件如何隱藏差異:它把固定大小向量從型別系統中移除,只支援所有平台交集的運算,並以其他 SIMD 指令高效填補落差。官方列出四項目標:足以支撐許多受惠於向量化的資料處理演算法;當原始碼操作與底層硬件吻合時,效率與組譯相同;否則盡量良好地模擬;以及易於閱讀理解——即使程式碼最終由大型語言模型撰寫亦然。[1]

使用方式

使用這個實驗性套件須設定 GOEXPERIMENT=simd。官方指出,simd 向量型別就是首字母大寫的複數原生型別,例如 simd.Uint8s 或 simd.Float32s;向量由切片載入、儲存。文章以內積運算為例,示範以 simd.LoadFloat32s 載入兩段切片、以 MulAdd 累加,並在尾段以部分載入處理剩餘元素。[1]

下一步

官方表示,計劃另發文章更詳細介紹 archsimd。就 Go 1.28 而言,團隊打算為 archsimd 加入 SVE 支援,並希望同步加入 simd;亦希望為 simd 增加更多 SIMD 操作,例如位元計數、遮罩運算、歸約運算與向量重排。Go 1.28 亦會包含少量「功能變體」,避免在具備硬件向量實作、只缺一兩個操作的平台上,降級至完全模擬,例如 Raspberry Pi。[1]

參考資料

[1] The Go Blog — Platform-independent SIMD in Go(2026 年 9 月 24 日)

[2] The Go Blog — Green Tea garbage collector

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*