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