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];
- AWeil die Adressen benachbarter Threads 128 Byte auseinanderliegen, kein Coalescing möglich ist und jeder Thread einen anderen Speicherblock liest
- BWeil die Multiplikation Zeit kostet
- 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.