4 Punkte von GN⁺ 2024-10-19 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2024-10-19
Hacker-News-Kommentare
  • Erklärung zu NOSPLIT: In Go-Assembly ist dies eine spezielle Syntax zur Beschreibung von Frame-Größe und Argumentgröße

    • Frame-Größe und Argumentgröße werden durch - getrennt; das ist keine mathematische Subtraktion
    • Das Tool go vet prüft, ob die Argumentgröße korrekt ist
  • Meinung zur Interpretation durch LLMs (Large Language Models): Es kann zu Missverständnissen bei der Code-Interpretation kommen

    • Wenn der Autor das offen einräumt, könnte das beim Lernen helfen
  • Erwähnung der internen Assembly-Sprache Plan9 von Go: Go verwendet eine eigene Assembly-Sprache

    • Auf amd64 ist int 64 Bit breit, und bei Verwendung von int32 erfolgt in der Argumentliste eine Wortausrichtung
    • NOSPLIT ist in textflag.h definiert und nur in der Runtime gültig
  • Rob 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

    • Ausgehend von Handbüchern für neue Architekturen kann der Assembler automatisch generiert werden
  • Meinung zur Verwendung von Funktionen für SIMD-Operationen: Es werden Funktionen benötigt, die SIMD-Operationen auf Slices ausführen können

    • Beim Addieren zweier Slices könnte SIMD statt einer for-Schleife verwendet werden, um parallel zu verarbeiten
  • Designphilosophie des Go-Compilers: Ziel ist ein einfacher und schneller Compiler statt eines komplexen Compilers

    • Die grundlegende x64-Unterstützung umfasst SSE und SSE2, wobei Einfachheit wichtiger ist als maximale Performance
  • 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

    • In Go könnte das jedoch wegen des Mangels an GPU-Paketen und Community-Unterstützung ungeeignet sein