Nutzung von Go für Concurrency und Parallelität
- Vorstellung eines Projekts, das die Rechenleistung für numerische Berechnungen durch die Nutzung von Concurrency und Parallelität in Go verbessern soll.
- Mit SIMD- (Same Instruction Multiple Data) Befehlen lassen sich Berechnungen auf Hardware-Ebene parallel ausführen.
- Da der Go-Compiler SIMD nicht nutzt und kein geeignetes allgemeines SIMD-Paket gefunden wurde, wurde beschlossen, ein eigenes Paket zu entwickeln.
Plan9-Assemblersprache
- Go verwendet mit Plan9 eine eigene Assemblersprache, die die Befehle und Register einer bestimmten Plattform leicht angepasst übernimmt.
- x86-Plan9 und ARM-Plan9 unterscheiden sich voneinander.
- Anhand eines einfachen Plan9-Beispiels werden die grundlegenden Verwendungsweisen erklärt.
Plan9-Beispiel
- Anhand der Dateien
AddInts_amd64.s und main.go werden die grundlegende Funktionsdeklaration und Verwendung in Plan9 erklärt.
- Es wird erläutert, wie Funktionsargumente und Rückgabewerte gemäß den Aufrufkonventionen von Go auf dem Stack gespeichert werden.
Geplantes Paketdesign
- Es wird ein Paket entworfen, das eine schlanke Abstraktionsschicht für SIMD-Operationen bei Arithmetik und Bitoperationen bereitstellt.
- Dafür wird ein internes Paket mit architekturspezifischen Plan9-Implementierungen erstellt und über eine Initialisierungsfunktion eingerichtet.
SIMD-Beispiel
- Anhand eines Beispiels für eine x86-SIMD-Plan9-Funktion wird die Verwendung von SIMD erklärt.
- Mit den Dateien
Supported_amd64.s und AddFloat32_amd64.s wird gezeigt, wie sich SSE-Unterstützung prüfen und eine Additionsoperation für float32 ausführen lässt.
Leistung und Ausblick
- Ein Diagramm zum Leistungsunterschied zwischen der Go-Softwareimplementierung und der Plan9-SIMD-Implementierung zeigt einen Geschwindigkeitsgewinn von etwa 200–450 %.
- Es wird gehofft, dass diese Notiz zu Projekten mit Plan9 und SIMD inspiriert.
# GN⁺-Zusammenfassung
- Dieser Artikel stellt vor, wie sich die Leistung durch die Nutzung von Concurrency und Parallelität in Go maximieren lässt.
- Es wird erklärt, wie sich mit der Plan9-Assemblersprache und SIMD-Befehlen Berechnungen auf Hardware-Ebene parallel ausführen lassen.
- Der Artikel zeigt Go-Entwicklern die Einsatzmöglichkeiten von Plan9 und SIMD auf und kann nützlich sein, um neue Ansätze zur Leistungssteigerung zu erkunden.
- Als Projekte mit ähnlicher Funktionalität werden SIMD-Unterstützungsbibliotheken für Rust oder SIMD-bezogene Bibliotheken für C++ empfohlen.
1 Kommentare
Hacker-News-Kommentare
Erklärung zu
NOSPLIT: In Go-Assembly ist dies eine spezielle Syntax zur Beschreibung von Frame-Größe und Argumentgröße-getrennt; das ist keine mathematische Subtraktiongo vetprüft, ob die Argumentgröße korrekt istMeinung zur Interpretation durch LLMs (Large Language Models): Es kann zu Missverständnissen bei der Code-Interpretation kommen
Erwähnung der internen Assembly-Sprache
Plan9von Go: Go verwendet eine eigene Assembly-Spracheint64 Bit breit, und bei Verwendung vonint32erfolgt in der Argumentliste eine WortausrichtungNOSPLITist intextflag.hdefiniert und nur in der Runtime gültigRob Pikes Erklärung zum Design von Go-Assembly: Es wurde eine gemeinsame Assembly-Sprache geschaffen, damit man mit Maschinen kommunizieren kann, ohne für jede Architektur eine neue Syntax lernen zu müssen
Meinung zur Verwendung von Funktionen für SIMD-Operationen: Es werden Funktionen benötigt, die SIMD-Operationen auf Slices ausführen können
for-Schleife verwendet werden, um parallel zu verarbeitenDesignphilosophie des Go-Compilers: Ziel ist ein einfacher und schneller Compiler statt eines komplexen Compilers
Meinung zum Einsatz von GPUs für SIMD-Operationen: GPUs könnten für SIMD-Operationen besser geeignet sein, da sie stark in Parallelverarbeitung und Matrixoperationen sind