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 ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
2.6. OPTIMIERTES PROGRAMMIEREN MIT CUDA 35<br />
Die Datentypen Integer und Unsigned Integer<br />
Damit es zu keinem undefinierten Ergebnis kommen kann, sind in der Standard<br />
C Programmiersprache Overflow Semantics für Unsigned Integer Variablen<br />
enthalten. Daher kann der Compiler besser bei der Verwendung von<br />
vorzeichenbehafteter Arithmetik optimieren als bei solcher, die nicht vorzeichenbehaftet<br />
ist. Aus diesem Grund sollte darauf geachtet werden, auch<br />
Variablen, die nur positive Werte speichern als Integer zu deklarieren.<br />
Verwendung von Kontrollstrukturen<br />
Warps, in denen durch If- oder Case- Anweisungen die weitere Befehlssequenz<br />
divergiert, sollten unbedingt vermieden werden. Der Multiprozessor<br />
behandelt jeden Pfad separat, was im schlechtesten Fall zu einer sequentiellen<br />
Ausführung der Threads eines Warps führen kann. Erst nachdem alle<br />
Verzweigungen bearbeitet wurden kehrt der Kernel zurück zur parallelen Berechnung.<br />
Statt bei einer Verzweigung Threads zu <strong>über</strong>springen wird eine<br />
Bedingung hinzugefügt. Ist die Vorraussetzung der Kontrollstruktur nicht<br />
erfüllt, so markiert CUDA den Prozess als false. Diese Threads werden zwar<br />
weiterhin dem Scheduler zur Bearbeitung freigegeben, schreiben bzw. lesen<br />
jedoch keine Daten.<br />
Programmierbeschränkungen<br />
Bei der Programmierung mit CUDA sollten folgende Einschränkungen beachtet<br />
werden.<br />
1. Der Kernel gibt die Kontrolle an den CPU Thread zurück, bevor dieser<br />
seine Berechnungen beendet hat.<br />
2. Wenn in dem gemeinsamen Speicher mehrere Variable verwendet werden<br />
muss der Benutzer das Offset zur Startadresse selbst setzen.<br />
3. Erst nach Threadfence(), TheadBlock() oder Syncthreads() ist es sicher,<br />
dass vorherige Schreibzugriffe auf den globalen oder gemeinsamen<br />
Speicher auch für die anderen Threads sichtbar sind.