Dev News Daily ENDE

Go 1.27 bringt ein portables SIMD-Paket und verbirgt Vektorbreiten von 128 bis 2048 Bit

Go 1.26 lieferte eine experimentelle SIMD-Schnittstelle fuer amd64, Go 1.27 erweitert sie um arm64 NEON und um wasm. Beide liegen im architekturabhaengigen Paket archsimd, und das ist der ehrliche Ort dafuer: Die Plattformen unterscheiden sich nicht nur darin, welche Operationen es gibt, sondern schon darin, wie ein Vektor ueberhaupt dargestellt wird. Die einen legen die Breite beim Uebersetzen fest, die anderen erst beim Programmstart.

Go 1.27 setzt eine zweite, vollstaendig portable Schnittstelle darauf: ein Paket simd, lose an die Bibliothek Highway fuer C++ angelehnt. Unterstuetzt werden derzeit AVX, AVX2 und AVX512 auf amd64, NEON auf arm64 sowie die SIMD-Befehle von wasm. Das erklaerte Ziel ist einmal geschriebener Code, der dort, wo es Vektoreinheiten gibt, nahe an Assembler bleibt, und dort, wo es keine gibt, sauber emuliert wird.

Der Beitrag benennt ungewoehnlich offen, was diese portable Schicht schlucken muss. Feste 128 Bit auf wasm, PowerPC und s390x; drei Breiten auf amd64; riscv64 mit allem zwischen 128 und 65536 Bit, solange es eine Zweierpotenz ist; arm64 mit NEON bei 128 und SVE von 128 bis 2048. Beim Maskieren dasselbe Bild: AVX512 und RVV haben eigene Maskenregister mit einem Bit je Element, waehrend wasm, AVX, AVX2 und NEON ohne Masken auskommen und sie mit Vektor-Bitmasken nachbilden.

Go 1.27 bringt ein portables SIMD-Paket und verbirgt Vektorbreiten von 128 bis 2048 Bit
Go 1.27 bringt ein portables SIMD-Paket und verbirgt Vektorbreiten von 128 bis 2048 Bit — Dev News Daily

Was das bedeutet

Bisher fuehrte der Weg zu den Vektoreinheiten in Go ueber Go-Assembler. Das lohnt sich fuer eine Handvoll heisser Kernroutinen und sonst nirgends. Die Folge war nicht, dass Go-Programme langsam gewesen waeren, sondern dass die meisten einen grossen Teil der CPU ungenutzt liessen, weil der einzige verfuegbare Weg fuer gewoehnlichen Code zu teuer war.

Bemerkenswert ist die Entscheidung, beide Pakete zu behalten. Eine portable Schnittstelle, die das Maskieren von AVX512 stillschweigend verliert, waere schlimmer als gar keine, denn die Leistung waere plausibel und die Grenze unsichtbar. Weil archsimd darunter liegt, laesst sich die portable Schicht an dem messen, wofuer sie gedacht ist — an dem Code, den man sonst skalar geschrieben haette —, statt handgeschriebene Kernroutinen ersetzen zu muessen. Beide sind experimentell; zu beobachten ist im naechsten Zyklus deshalb nicht die Messkurve, sondern zu welchem der beiden Pakete die Leute tatsaechlich greifen.

Primärquelle
The Go Blog
https://go.dev/blog/simd-experiment
Geschrieben von Victoria Shinder.