Wie eine GPU ihre Threads ordnet
Eine GPU (Graphics Processing Unit, Grafikprozessor) ist ein Chip, der eine kleine Funktion von tausenden Threads gleichzeitig ausführen lässt. Die Threads sind in Blöcken geordnet, die Blöcke in einem Gitter (Grid).
Jeder Thread muss selbst ausrechnen, welches Element ihm gehört. Genau diese Rechnung lernen Sie hier.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie eine GPU ihre Threads in Blöcken und einem Gitter ordnet.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Thread | ein kleiner Ablauf, der ein Element bearbeitet | |
| Block | eine Gruppe von Threads, die zusammen gestartet wird | |
| Gitter | alle Blöcke eines Starts (Grid) | |
| Blockgröße | die Zahl der Threads in einem Block | 256 |
| Globaler Index | die Nummer eines Threads im ganzen Gitter |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Auch hier gibt es keine GPU
Wichtig
Das Lab-Skript spielt den Start einer GPU in Python nach, Thread für Thread nacheinander. Es zeigt die Ordnung und die Rechnung, nicht die Geschwindigkeit.
Eine GPU hat sehr viele einfache Recheneinheiten
Eine CPU hat wenige starke Kerne, die ganz verschiedene Aufgaben erledigen. Eine GPU hat sehr viele einfache Recheneinheiten, die dieselbe Aufgabe auf vielen Daten ausführen.
Die kleine Funktion, die jeder Thread ausführt, heißt Kernel. Ein Start führt sie für jeden Thread einmal aus.
Globaler Index: Block mal Größe plus Thread
In jedem Block zählen die Threads wieder bei 0. Damit jeder ein eigenes Element findet, braucht er eine Nummer im ganzen Gitter.
Die Regel: globaler Index = Blocknummer mal Blockgröße plus Threadnummer. Block 1, Thread 2 und Blockgröße 4 ergeben 1 mal 4 plus 2, also 6.
Drei Blöcke zu je vier Threads
| Block | Thread 0 | Thread 1 | Thread 2 | Thread 3 |
|---|---|---|---|---|
| 0 | 0 | 1 | 2 | 3 |
| 1 | 4 | 5 | 6 | 7 |
| 2 | 8 | 9 | 10 | 11 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Tabelle in Python
# Ein Start mit 3 Bloecken zu je 4 Threads.
bloecke = 3
block_groesse = 4
for block_nr in range(bloecke):
for thread_nr in range(block_groesse):
index = block_nr * block_groesse + thread_nr
print("Block", block_nr, "Thread", thread_nr, "-> Index", index)
# Aendern Sie block_groesse auf 8 und bloecke auf 2.
Das Lab spielt einen Start nach
Das Skript kernel.py startet 3 Blöcke zu je 4 Threads für 10 Elemente und gibt für jeden Thread eine Zeile aus. Die Wörter „block“, „thread“ und „global index“ sind englisch.
Die letzten beiden Zeilen haben die Indizes 10 und 11. Dort gibt es kein Element, und der Thread tut nichts.
Ein simulierter Start im Lab
docker exec jupyter python3 steps/kernel.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Block 2, Blockgröße 256, Thread 5
docker exec jupyter python3 -c "print(2 * 256 + 5)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Jedes Element braucht einen Thread
Zehn Elemente und Blöcke zu vier Threads: Zwei Blöcke reichen nicht, es wären nur acht Threads. Man braucht drei Blöcke, also zwölf Threads.
Man teilt die Elemente durch die Blockgröße und rundet auf. Die Threads ohne Element sind überzählig.
Blöcke und überzählige Threads
| Elemente | Blockgröße | Blöcke | Threads | Überzählig |
|---|---|---|---|---|
| 10 | 4 | 3 | 12 | 2 |
| 8 | 4 | 2 | 8 | 0 |
| 1000 | 256 | 4 | 1024 | 24 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Aufrunden von zehn durch vier
docker exec jupyter python3 -c "print(-(-10 // 4))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, die Threadnummer reiche aus, um das Element zu finden. Sie beginnt aber in jedem Block bei 0. Erst mit der Blocknummer ergibt sich der globale Index. Ohne sie bearbeiten alle Blöcke dieselben ersten Elemente.
Weiterführend
Ein Bild hat 1920 mal 1080 Bildpunkte, also 2.073.600. Wie viele Blöcke zu 256 Threads braucht man, und wie viele Threads sind überzählig?
Prüfen Sie es mit der Tabelle oben und mit dem Befehl zum Aufrunden.