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.4. CUDA 15<br />

realisieren, da eine Zeitmessung mit Hilfe von CPU- oder GPU- Timern statt<br />

finden kann. Die Vor- und Nachteile beider Möglichkeiten sollen im Folgenden<br />

dargestellt werden.<br />

Soll mit Hilfe des CPU-Timers ermittelt werden, wie lange ein Kernel<br />

braucht, um seine Berechnungen durchzuführen, so kommt es vor, dass dieser<br />

lediglich die Zeit misst, die für den Aufruf der CUDA API benötigt wird.<br />

Dies liegt darin begründet, dass es sich bei Funktionen, wie Kernelaufrufe<br />

und Kopiervorgänge zwischen Speichern, um asynchrone Prozesse handeln<br />

kann. In diesem Fall wird die Kontrolle an den CPU Thread zurückgegeben<br />

bevor die Prozesse ihre Berechnungen beendet haben. Wenn die korrekte Zeit<br />

für die komplette Abarbeitung ermittelt werden soll muss zuerst der CPU<br />

Thread mit dem GPU Thread synchronisiert werden. In diesem Fall wird der<br />

CPU Thread bis zur Beendigung der Berechnungen blockiert. Bei den resultierenden<br />

Werten sollte jedoch bedacht werden, dass die Synchronisation<br />

von CPU und GPU ein Drosseln in der GPU-Pipeline hervorrufen und so die<br />

Performanz negativ beeinflussen kann.<br />

Um die benötigte Zeit eines Streams zu ermitteln eignet sich nur der synchrone<br />

Defaultstream (Siehe auch Kapitel 2.3.3). Bei allen Anderen können<br />

Zeiten für den Aufruf von weiteren Streams in den Messungen enthalten sein.<br />

Im Defaultstream wird das Event erst ausgelöst, wenn alle Tasks und Kommandos<br />

von allen vorangegangenen Streams beendet wurden.<br />

Die CUDA Event API unterstützt Aufrufe, die Events erzeugen und zerstören<br />

können. Diese ermöglichen es, eine genaue Zeitanalyse der Kernel mit Hilfe<br />

von GPU-Timern durchzuführen. Spezielle Funktionen messen dafür die<br />

Millisekunden zwischen dem Eintreten der Events. Ein weiterer Vorteil der<br />

GPU Timer ist, dass sie mit der GPU-Clock arbeiten und somit betriebssystemunabhängig<br />

sind.<br />

Synchronisationsfunktionen<br />

Es gibt verschiedene Funktionen mit deren Hilfe Threads synchronisiert werden<br />

können. Mit threadfence() ist es möglich die weitere Abarbeitung zu<br />

blockieren, bis alle globalen Speicherzugriffe für alle Threads auf einem Device<br />

und alle Speicherzugriffe von allen Threads des selben Blocks auf den<br />

Shared Memory abgeschlossen und die Ergebnisse sichtbar sind. Notwendig<br />

wird dies, wenn Threads Daten lesen sollen, die von anderen erst kurz zuvor

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!