GPU-Programmierung

Wird, wie oben gezeigt, mit der Thread-Nummer i ein Array in Abständen von 32 Elementen gelesen, ist dies langsamer als das Lesen von a[i]. Was ist der Hauptgrund?

float x = a[i * 32];
  1. AWeil die Adressen benachbarter Threads 128 Byte auseinanderliegen, kein Coalescing möglich ist und jeder Thread einen anderen Speicherblock liest
  2. BWeil die Multiplikation Zeit kostet
  3. CWeil beim Lesen in Abständen von 32 Elementen die Werte nicht korrekt gelesen werden
Antwort und Erläuterung anzeigen

Antwort: A. Weil die Adressen benachbarter Threads 128 Byte auseinanderliegen, kein Coalescing möglich ist und jeder Thread einen anderen Speicherblock liest

Da float 4 Byte belegt, liegen bei a[i*32] die Adressen benachbarter Threads 128 Byte auseinander. Die 32 Threads eines Warps lesen 32 verschiedene Blöcke und nutzen aus jedem nur 4 Byte. Bei a[i] genügt für 32 Threads ein einziger Block von 128 Byte, sodass die transportierte Datenmenge um ein Vielfaches abweicht. Bei zweidimensionalen Arrays gilt grundsätzlich, die Thread-Nummer dem inneren Index (aufeinanderfolgende Adressen) zuzuordnen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Welche Anordnung ist unter dem Gesichtspunkt des Memory Coalescing vorteilhaft, wenn Daten mit den Partikelpositionen x, y, z auf der GPU verarbeitet werden?
  2. Welche Aussage zum Shared Memory von CUDA ist richtig?
  3. Welche Funktion hat __syncthreads() in CUDA?
  4. In CUDA wurde __syncthreads() innerhalb von „if (threadIdx.x < 16)“ geschrieben, sodass nur ein Teil der Threads es durchläuft. Was kann geschehen?
  5. Welche Aussage zum Bank Conflict im Shared Memory von CUDA ist richtig?

Vergleiche zu diesem Thema