22.09.2013 Aufrufe

Workshopband als PDF - Mpc.belwue.de

Workshopband als PDF - Mpc.belwue.de

Workshopband als PDF - Mpc.belwue.de

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.

MPC-WORKSHOP FEBRUAR 2013<br />

Coremark / MHz<br />

0,6<br />

0,5<br />

0,4<br />

0,3<br />

0,2<br />

0,1<br />

0<br />

AMD<br />

Hulk Janus 2.0 Am386DX<br />

-Ox<br />

CM / MHz 0,502 0,292 0,25<br />

Abbildung 3: Optimierte Benchmark Coremark – Ergebnisse.<br />

setzt wur<strong>de</strong>, welcher jedoch über keine Optimie-<br />

rungsoptionen, wie z.B. <strong>de</strong>r GCC-Compiler, verfügt.<br />

Ein Nachteil besteht darin, dass zum einen nicht nur<br />

<strong>de</strong>r verwen<strong>de</strong>te Compiler mitgetestet wird, son<strong>de</strong>rn<br />

auch <strong>de</strong>ssen Optimierungsstufe, was einen direkten<br />

Vergleich <strong>de</strong>r Benchmark-Ergebnisse erschwert.<br />

Ausgehend von diesen Tatsachen erreichte <strong>de</strong>r<br />

SIRIUS HULK einen Benchmark-Wert von<br />

0,502 CM/MHz und <strong>de</strong>r SIRIUS Janus 2.0 einen Wert<br />

von 0,292 CM/MHz. Wie in Abbildung 3 ersichtlich,<br />

ist <strong>de</strong>r SIRIUS HULK damit bereits doppelt so leistungsfähig<br />

wie ein AMD Am386DX und in etwa 72%<br />

schneller <strong>als</strong> <strong>de</strong>r SIRIUS Janus. Ausgehend von diesen<br />

Resultaten stellte sich heraus, dass Optimierungspotential<br />

vorlag, sowohl auf Seiten <strong>de</strong>r Software, <strong>als</strong><br />

auch auf Seiten <strong>de</strong>r Hardware.<br />

A. Software<br />

IV. OPTIMIERUNGEN<br />

Die Verbesserung auf Compiler-Seite bezieht sich<br />

auf die Einführung sogenannter Registervariablen. Der<br />

Unterschied zu <strong>de</strong>n bisher verwen<strong>de</strong>ten Stackvariablen<br />

besteht darin, dass eine im Co<strong>de</strong> angelegte lokale<br />

Variable nicht mehr auf <strong>de</strong>m Stack angelegt wird,<br />

wodurch <strong>de</strong>r Wert <strong>de</strong>r Variablen je<strong>de</strong>s Mal bei Verwendung<br />

mit Hilfe von Load- und Store-Instructions<br />

gela<strong>de</strong>n bzw. abgelegt wer<strong>de</strong>n muss, son<strong>de</strong>rn stets in<br />

einem freien Prozessorregister gehalten wird. Hierdurch<br />

entfallen die Load- und Store-Instructions, was<br />

die Co<strong>de</strong>ausführung beschleunigt. Diese Optimierung<br />

musste rein auf Seiten <strong>de</strong>s Compilers vorgenommen<br />

wer<strong>de</strong>n und hat je nach Anzahl <strong>de</strong>r benötigten lokalen<br />

Variablen Einfluss auf die Gesamtausführungszeit<br />

eines Programmes. Anhand <strong>de</strong>s Benchmarks<br />

Coremark zeigte sich, dass es sich vor allem auf die<br />

Ausführungszeit <strong>de</strong>r CRC-Berechnungen auswirkte<br />

und allgemein wie erwartet auf alle Co<strong>de</strong>abschnitte<br />

mit lokalen Variablen. Eine Begrenzung dieser Optimierung<br />

liegt einzig in <strong>de</strong>r Verfügbarkeit freier Prozessorregister<br />

zum jeweiligen Zeitpunkt, an <strong>de</strong>m <strong>de</strong>r<br />

Einsatz einer Registervariablen möglich wäre. Abbildung<br />

4 zeigt beispielhaft die Verkürzung <strong>de</strong>s auszuführen<strong>de</strong>n<br />

Co<strong>de</strong>s durch <strong>de</strong>n Einsatz von Registervariablen.<br />

<br />

<br />

<br />

Abbildung 4: Einsatz von Registervariablen.<br />

Bisher: Immer 3 Taktzyklen<br />

15 0 15 0 15<br />

0<br />

Jetzt: Entscheidung anhand <strong>de</strong>r Größe <strong>de</strong>s Wertes<br />

Beispiel: ADI (-Short), Wert < 63<br />

15<br />

15<br />

Abbildung 5: Überladung <strong>de</strong>r Instructions.<br />

B. Hardware<br />

0<br />

0 1 0 0 1 1<br />

Beispiel: ADI (-Short), Wert > 63 / „Umschalter“ = 63<br />

0<br />

1 1 1 1 1 1<br />

15 0 15<br />

0<br />

Die Optimierung <strong>de</strong>r Hardware bestand darin, verschie<strong>de</strong>ne<br />

Instructions zu überla<strong>de</strong>n. Das Prinzip dahinter<br />

wird in Abbildung 5 anhand <strong>de</strong>s Befehls ADI<br />

(Add Immediate) ver<strong>de</strong>utlicht. Bisher wur<strong>de</strong> die zum<br />

Quellregister (grün coloriert) zu addieren<strong>de</strong> Konstante<br />

stets in zwei getrennten 16-Bit-Worten übertragen<br />

(rot), unabhängig von <strong>de</strong>r Größe <strong>de</strong>r Konstanten. Da<br />

es sich bei ADI jedoch um einen Immediate-Befehl<br />

han<strong>de</strong>lt, sind in diesem Falle jedoch keine Opco<strong>de</strong>-<br />

Bits für ein Zielregister erfor<strong>de</strong>rlich. Somit sind insgesamt<br />

sechs Bits innerhalb <strong>de</strong>s Opco<strong>de</strong>s ungenutzt (in<br />

Abbildung 5 grau dargestellt). Bei <strong>de</strong>r Überladung<br />

wer<strong>de</strong>n diese ungenutzten Bits nun dazu verwen<strong>de</strong>t,<br />

Konstanten zu <strong>de</strong>finieren. Ist die Konstante größer <strong>als</strong><br />

sechs Bit, wird anhand eines „Umschalters“ <strong>de</strong>m Prozessor<br />

mitgeteilt, dass die zwei darauffolgen<strong>de</strong>n 16-<br />

Bit-Worte die Konstante darstellen. Hieraus ergibt<br />

sich eine verkürzte Ausführungszeit für all diejenigen<br />

Konstanten, die einen Wert kleiner 63 besitzen. Der<br />

Wert 63 dient in diesem Fall <strong>als</strong> „Umschalter“. Somit<br />

können bei <strong>de</strong>r Überladung im I<strong>de</strong>alfall 2 Zyklen pro<br />

überla<strong>de</strong>ner Instruktion gespart wer<strong>de</strong>n.<br />

Bei Sprungbefehlen fällt die ungenutzte Bitbreite<br />

und somit die innerhalb eines Opco<strong>de</strong>s übertragbare<br />

Konstante mit 10 Bit noch größer aus, sodass hieraus<br />

ein maximaler Sprung von ±1022 realisierbar ist. Der<br />

Wert +1024 dient <strong>als</strong> „Umschalter“ in diesem Falle.<br />

Es gilt zu beachten, dass pro Konstanten-Wert immer<br />

um zwei Byte (eine Instruction) gesprungen wird und<br />

hieraus <strong>de</strong>r Sprungbereich von ±1022 resultiert.<br />

41

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!