03.03.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!