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];
}
  1. 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
  2. BDamit das Ergebnis der Addition n nicht übersteigt
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Wie heißt bei NVIDIA-GPUs die Einheit, in der 32 Threads zu einem Bündel zusammengefasst werden und dieselbe Anweisung gleichzeitig ausführen?
  2. Welche Aussage zum Unterschied zwischen dem SIMT-Verfahren (Single Instruction, Multiple Threads) der GPU und SIMD-Befehlen der CPU ist richtig?
  3. Innerhalb eines Warps teilt sich durch eine bedingte Verzweigung eine Hälfte der Threads auf die if-Seite und die andere Hälfte auf die else-Seite auf (Warp Divergence). Wie wird dies im Allgemeinen ausgeführt?
  4. Beide Varianten (1) und (2) oben lassen eine Hälfte der Threads A und die andere Hälfte B ausführen. Welche Aussage zur Warp-Effizienz ist richtig (ein Warp habe 32 Threads)?
  5. Welche Aussage zum Memory Coalescing der GPU ist richtig?

Vergleiche zu diesem Thema