19.02.2014 Aufrufe

2. Abschattung Kosmischer Strahlung durch den Mond in IceCube

2. Abschattung Kosmischer Strahlung durch den Mond in IceCube

2. Abschattung Kosmischer Strahlung durch den Mond in IceCube

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Berechnungen mit Graphik Prozessoren (GPU)<br />

3. Bei e<strong>in</strong>er kle<strong>in</strong>en Anzahl von Punkten gibt es zudem die Möglichkeit, beide zuvor beschriebenen<br />

Strategien zu komb<strong>in</strong>ieren. Da Threads <strong>in</strong>nerhalb e<strong>in</strong>es Blocks über <strong>den</strong> shared-Memory<br />

kommunizieren können, ist es möglich die M<strong>in</strong>imierung der − log L-Funktion pro Gridpunkt<br />

auf e<strong>in</strong>em Block <strong>durch</strong>zuführen. Hierbei übernimmt e<strong>in</strong> Thread pro Block die M<strong>in</strong>imierungsrechnungen.<br />

Alle weiteren Threads berechnen bei Funktionsaufrufen Teilsummen der − log L-<br />

Funktion, um somit geme<strong>in</strong>sam schneller die Gesamtsumme zu errechnen.<br />

Folglich macht jeder Block die M<strong>in</strong>imierung und jeder Thread im Block hilft bei der − log L-<br />

Berechnung. Auch hier wird die CPU kaum benötigt.<br />

Strategie 3 bietet gegenüber der zweiten Strategie für h<strong>in</strong>reichend viele Gridpunkte ke<strong>in</strong>en Vorteil,<br />

da e<strong>in</strong>ige Blöcke warten müssten, bis die ersten Blöcke fertig berechnet wur<strong>den</strong>. Weiterh<strong>in</strong> ist die<br />

Strategie 2 speziell für große Summen <strong>in</strong> Funktionsaufrufen geeignet und ist am e<strong>in</strong>fachsten zu<br />

implementieren.<br />

Für diese Arbeit wird Strategie 2 implementiert, da die Analyse mit vielen Gridpunken (16384)<br />

<strong>durch</strong>geführt wird.<br />

Zur Umsetzung wird e<strong>in</strong> C++-Programm mit ROOT-Funktionen erstellt. In diesem Programm<br />

wer<strong>den</strong> die Daten, die im ROOT-Format vorhan<strong>den</strong> s<strong>in</strong>d, zunächst e<strong>in</strong>gelesen und e<strong>in</strong>e H<strong>in</strong>tergrundverteilung<br />

bestimmt. Für die Ereignisse, für die die Qualitätskriterien (siehe Abschnitt 3.3)<br />

erfüllt s<strong>in</strong>d, wer<strong>den</strong> die Daten <strong>in</strong> e<strong>in</strong>em Array gespeichert. Hierbei wer<strong>den</strong> je Event die Werte<br />

δ azimuth , δ zenith (siehe Gleichung <strong>2.</strong>5), der Wert der Background-Verteilung für diese W<strong>in</strong>kel<br />

und die benötigten Fehler auf die Schätzung gespeichert. Von diesem Programm aus wird e<strong>in</strong>e C-<br />

Funktion aufgerufen, die als Schnittstelle dient. Als Parameter dienen die Arrays mit <strong>den</strong> Daten der<br />

Events, sowie e<strong>in</strong>ige Hilfsparameter um die M<strong>in</strong>imierung <strong>durch</strong>zuführen und später die Ergebnisse<br />

zu erhalten.<br />

Die C-Funktion ist der Teil des Programms, der die Schnittstelle zwischen CPU und GPU darstellt.<br />

Ihre Aufgabe ist es, Speicher auf der GPU zu reservieren, die übergebenen Daten auf <strong>den</strong><br />

Speicher <strong>in</strong> der GPU zu kopieren und die Grid- und Blockdimensionen festzulegen. Anschließend<br />

ruft sie <strong>den</strong> Kernel auf, der die Berechnungen auf der GPU <strong>durch</strong>führt. Nach Beendigung des Kernels<br />

wird <strong>in</strong> dieser Funktion das Ergebnis der Berechnung von der GPU auf <strong>den</strong> Hauptspeicher des<br />

Computers zurück kopiert und der Speicher auf der GPU freigegeben.<br />

Damit der Kernel für je<strong>den</strong> Thread e<strong>in</strong>e M<strong>in</strong>imierung auf e<strong>in</strong>em eigenen Gridpunkt ausführen<br />

kann, wird mithilfe der CUDA-Konstanten BlockIdx.x, BlockIdx.y und ThreadIdx.x e<strong>in</strong><br />

e<strong>in</strong>deutiger Index für diesen Thread berechnet. Aus diesem Index wird zum e<strong>in</strong>en <strong>durch</strong> e<strong>in</strong>e ganzzahlige<br />

Division und zum anderen <strong>durch</strong> e<strong>in</strong>e Modulo-Operation die Position des Gridpunktes<br />

berechnet.<br />

Jeder Thread berechnet nun nach dem <strong>in</strong> Abschnitt 4.5 beschriebenen M<strong>in</strong>imierungsverfahren<br />

das n s , für das die − log L-Funktion <strong>den</strong> m<strong>in</strong>imalen Wert, am entsprechen<strong>den</strong> Gridpunkt, annimmt.<br />

Beim Funktionsaufruf wird e<strong>in</strong>e __device__-Funktion aufgerufen, die die Berechnung der − log L-<br />

Funktion auf dem Thread <strong>durch</strong>führt.<br />

Der n s -Wert und der Wert der − log L-Funktion am Ort des M<strong>in</strong>imums sowie die Anzahl der<br />

Iterationen wer<strong>den</strong> <strong>in</strong> je e<strong>in</strong>em Array im Global Memory der GPU gespeichert. Die Position im<br />

Array, an der die Daten gespeichert wer<strong>den</strong>, entspricht dem e<strong>in</strong>maligen Index, <strong>den</strong> jeder Thread<br />

besitzt. Durch <strong>den</strong> CUDA-Funktionsaufruf __syncthreads() wird die Berechnung e<strong>in</strong>es Blocks<br />

erst weiter fortgesetzt, wenn alle Threads fertig berechnet wur<strong>den</strong>. Da die Anzahl der Iterationen<br />

annähernd gleich groß se<strong>in</strong> sollte, wird an dieser Stelle kaum Zeit verloren.<br />

Die Ergebnisse wer<strong>den</strong> an die C-Funktion zurückgegeben und von dort aus weiter an das Hauptprogramm.<br />

Hier können die Ergebnisse aus <strong>den</strong> Arrays aufgrund ihres Indexes an die korrekten<br />

Stellen <strong>in</strong> Histogramme geschrieben und <strong>in</strong> Dateien gespeichert wer<strong>den</strong>.<br />

Die resultieren<strong>den</strong> Ergebnisse können anschließend e<strong>in</strong>er weiteren Analyse unterzogen und graphisch<br />

dargestellt wer<strong>den</strong>.<br />

Das Programm, sowie der CPU- und GPU-E<strong>in</strong>satz, ist schematisch <strong>in</strong> Abbildung 4.5 dargestellt.<br />

Der Programm-Code ist unter http://code.icecube.wisc.edu/svn/sandbox/reimann/ verfügbar.<br />

16 RWTH Aachen

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!