GPU-Programmierung

Welchen Vorteil hat es, einen Kernel wie oben mit einer Schleife (Grid-Stride-Loop) zu schreiben?

for (int i = blockIdx.x * blockDim.x + threadIdx.x;
     i < n;
     i += blockDim.x * gridDim.x)
    y[i] = a * x[i] + y[i];
  1. AMit der Schleife ist kein Memory Coalescing mehr möglich
  2. BAuch wenn weniger Threads gestartet werden als Elemente vorhanden sind, bearbeitet jeder Thread mehrere Elemente im Abstand der Gesamtthreadzahl und alle Elemente werden verarbeitet
  3. CEs läuft nur noch ein einziger Thread
Antwort und Erläuterung anzeigen

Antwort: B. Auch wenn weniger Threads gestartet werden als Elemente vorhanden sind, bearbeitet jeder Thread mehrere Elemente im Abstand der Gesamtthreadzahl und alle Elemente werden verarbeitet

Es wird mit einem Schritt in Höhe der Gesamtthreadzahl (blockDim.x×gridDim.x) wiederholt; unabhängig von der Thread-Zahl werden so alle Elemente lückenlos verarbeitet. Es kann mit einer passenden Blockzahl gestartet werden, die an die Zahl der SMs der GPU angepasst ist, und auch der Aufwand für die Thread-Erzeugung sinkt. In jedem Schleifendurchlauf bearbeiten benachbarte Threads benachbarte Elemente, sodass auch das Memory Coalescing erhalten bleibt.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Bei welchem Zugriff arbeitet der Constant Memory von CUDA besonders schnell?
  2. Welche Aussage zu den Caches der GPU im Vergleich zur CPU ist im Allgemeinen richtig?
  3. Welches ist ein Beispiel für einen Programmiermechanismus für paralleles Rechnen auf GPUs usw., der auch auf anderen GPUs als denen von NVIDIA verwendet werden kann?
  4. Auf der GPU sollen nur die Elemente eines Arrays, die eine Bedingung erfüllen, herausgenommen und kompakt in ein anderes Array geschrieben werden (jeder Thread gibt 0 oder 1 Wert aus). Welche parallele Berechnung wird häufig verwendet, um die Schreibadresse jedes Threads zu bestimmen?
  5. Welche Voraussetzung gilt es beim Schreiben von GPU-Kerneln zu beachten?

Vergleiche zu diesem Thema