GPU-Programmierung

Warum wird bei gemischter Genauigkeit auf der GPU häufig die Multiplikation in niedriger Genauigkeit wie FP16 und die Aufsummierung (Akkumulation) in FP32 ausgeführt?

  1. AWeil Multiplikationen in FP32 nicht möglich sind
  2. BWeil sich beim Aufsummieren vieler Produkte in niedriger Genauigkeit Rundungsfehler ansammeln und kleine Werte verloren gehen, daher wird nur die Akkumulation mit hoher Genauigkeit ausgeführt
  3. CWeil Additionen in FP16 nicht möglich sind
Antwort und Erläuterung anzeigen

Antwort: B. Weil sich beim Aufsummieren vieler Produkte in niedriger Genauigkeit Rundungsfehler ansammeln und kleine Werte verloren gehen, daher wird nur die Akkumulation mit hoher Genauigkeit ausgeführt

Die Mantisse von FP16 hat nur 10 Bit, sodass beim Addieren eines kleinen Produkts zu einer groß gewordenen Summe das Produkt durch Rundung verschwinden kann. Beim Matrixprodukt werden tausende Produkte aufsummiert, und häufen sich diese Fehler, weicht das Ergebnis stark ab. Daher wird die Multiplikation, die viel Speicher und Recheneinheiten belastet, in niedriger Genauigkeit ausgeführt und nur die Akkumulation in FP32. Viele Tensor Cores führen diese Form des Multiply-Accumulate mit einer Anweisung aus.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Bei der Summierung derselben Gleitkommadaten auf der GPU unterschied sich die letzte Stelle des Ergebnisses bei jeder Ausführung geringfügig. Was ist die wahrscheinlichste Ursache?
  2. Was ist ein üblicher Richtwert für die Zahl der Threads pro Block in CUDA?
  3. Welchen Vorteil hat es, einen Kernel wie oben mit einer Schleife (Grid-Stride-Loop) zu schreiben?
  4. Bei welchem Zugriff arbeitet der Constant Memory von CUDA besonders schnell?
  5. Welche Aussage zu den Caches der GPU im Vergleich zur CPU ist im Allgemeinen richtig?

Vergleiche zu diesem Thema