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];
- AMit der Schleife ist kein Memory Coalescing mehr möglich
- BAuch wenn weniger Threads gestartet werden als Elemente vorhanden sind, bearbeitet jeder Thread mehrere Elemente im Abstand der Gesamtthreadzahl und alle Elemente werden verarbeitet
- 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.