GPU-Programmierung

Eine 32×32-float-Tabelle liegt im Shared Memory, und die 32 Threads eines Warps lesen in Spaltenrichtung (vertikal), wodurch Bank Conflicts entstehen. Welche Gegenmaßnahme ist üblich?

  1. ADie Tabelle bleibt 32×32, die Lesereihenfolge wird zufällig gewählt
  2. BAuf den Shared Memory wird verzichtet, und alles wird aus dem Global Memory gelesen
  3. CDie Tabelle wird mit einer zusätzlichen Spalte reserviert, z. B. 32×33, sodass die Bankposition von Zeile zu Zeile verschoben ist
Antwort und Erläuterung anzeigen

Antwort: C. Die Tabelle wird mit einer zusätzlichen Spalte reserviert, z. B. 32×33, sodass die Bankposition von Zeile zu Zeile verschoben ist

Hat eine Zeile 32 float-Werte (128 Byte), beginnt jede Zeile in derselben Bank, sodass alle Elemente derselben Spalte in derselben Bank liegen und beim vertikalen Lesen alle 32 Threads auf eine Bank treffen. Bei 33 Werten pro Zeile verschiebt sich die Bank mit jeder Zeile um eins, sodass sich die 32 Werte derselben Spalte auf alle Bänke verteilen und in einem Zugriff gelesen werden. Es ist ein einfacher Kniff, der nur eine ungenutzte Spalte zusätzlichen Speicher kostet.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Warum wird beim Berechnen eines großen Matrixprodukts auf der GPU die Matrix in kleine Tiles unterteilt und in den Shared Memory geladen?
  2. Was kann in einem GPU-Kernel geschehen, wenn jeder Thread zu viele Register verwendet?
  3. Welche Aussage zur Auslastung (Occupancy) der GPU ist richtig?
  4. Wie verbirgt die GPU hauptsächlich lange Speicherlatenzen (einige hundert Takte)?
  5. Welche Aussage zur Occupancy der GPU ist richtig?

Vergleiche zu diesem Thema