GPU-Programmierung
Was ist der Grund für die Bedingung „if (i < n)“ im oben gezeigten CUDA-Kernel?
__global__ void add(float *c, const float *a,
const float *b, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
c[i] = a[i] + b[i];
}
- ADamit überzählige Threads nicht außerhalb des Array-Bereichs lesen oder schreiben, wenn die Gesamtzahl der Threads größer ist als die Zahl der Elemente
- BDamit das Ergebnis der Addition n nicht übersteigt
- CUm die Geschwindigkeit der GPU zu verdoppeln
Antwort und Erläuterung anzeigen
Antwort: A. Damit überzählige Threads nicht außerhalb des Array-Bereichs lesen oder schreiben, wenn die Gesamtzahl der Threads größer ist als die Zahl der Elemente
Threads werden blockweise gestartet; ist die Elementzahl kein Vielfaches der Blockgröße, übersteigt die Gesamtzahl der Threads die Elementzahl. Wird ohne Prüfung der Nummer geschrieben, wird Speicher außerhalb des reservierten Arrays beschädigt oder es kommt zu einem Fehler durch unzulässigen Zugriff. Die Prüfung „i < n“ ist beim Schreiben von GPU-Kerneln eine nahezu feststehende Form.