Effizientes Lösen linearer Gleichungssysteme über GF(2) - CDC ...
Effizientes Lösen linearer Gleichungssysteme über GF(2) - CDC ...
Effizientes Lösen linearer Gleichungssysteme über GF(2) - CDC ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
2.6. OPTIMIERTES PROGRAMMIEREN MIT CUDA 31<br />
Programm erzielt eine deutlich schlechtere Performanz, da sich die Gesamtzeit<br />
durch die Ausführungszeit des zweiten Kernels, sowie die Verzögerungszeit<br />
des globalen Speichers, erhöht. Es empfiehlt sich daher die Verwendung<br />
atomarer Blöcke ohne Kommunikation einzelner Threads. Auch Synchronisationspunkte<br />
können die Ausführung eines Warps verzögern. In diesem Fall<br />
werden Threads bearbeitet, die diese Barriere nicht betrifft.<br />
Die Anzahl der Threads und Blöcke sollten so gewählt werden, dass die<br />
Hardware ausreichend ausgelastet ist. Die Metrik Auslastung besteht aus<br />
dem Verhältnis von aktiven Warps pro Multiprozessor zur maximal möglichen<br />
Menge.<br />
Die Anzahl von Blöcken und Warps die sich zeitgleich auf einem Multiprozessor<br />
befinden können hängt nicht nur von den Beschränkungen der Grafikkarte<br />
ab, sondern auch von den benötigten Ressourcen. Tritt der Fall ein, dass ein<br />
Block das Limit <strong>über</strong>schreitet, dann wird der Kernel nicht bearbeitet. Die<br />
Menge der benötigten Ressourcen, wie Register und Größe des gemeinsamen<br />
Speichers pro Block, kann berechnet werden.<br />
Berechnung der Anzahl von Warps<br />
Bei Devices mit einer Compute Capability von 1.x wird immer eine gerade<br />
Anzahl von Warps für einen Block zur Verfügung gestellt. Um die Menge<br />
benötigter Warps zu berechnen muss die Anzahl der Threads durch die<br />
Warpgröße geteilt und anschließend auf den nächst höheren geraden Wert<br />
aufgerundet werden.<br />
Berechnung der Anzahl benötigter Register<br />
Einer der Faktoren, welcher den Grad der Auslastung bestimmt, ist die Registerverfügbarkeit.<br />
Alle aktiven Threads eines Multiprozessors müssen sich die<br />
Menge der zur Verfügung stehenden Register teilen. Ist dies nicht möglich, so<br />
sind weniger Blöcke aktiv und es werden gegebenenfalls Daten in den lokalen<br />
Speicher ausgelagert, was zu erheblichen Verzögerungszeiten beim Abruf<br />
führt.<br />
Zuerst wird die Anzahl der Warps mit der Warpgröße sowie der Menge<br />
benötigter Registern pro Thread multipliziert. Grafikkarten mit einer Compute<br />
Capability von 1.0 und 1.1 stellen Register in Gruppen zu 256 Stück<br />
bereit. Bei Devices mit einer Compute Capability von 1.2 und 1.3 bestehen