Neue Antwort schreiben 
 
Themabewertung:
  • 1 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Welche Art von Optimierungen nehmen moderne Compiler vor?
niwax Offline
Hardcore-Coder

Beiträge: 3.829
Registriert seit: Dec 2009
Beitrag #11
RE: Welche Art von Optimierungen nehmen moderne Compiler vor?
(19.02.2014 16:41)oreissig schrieb:  
(19.02.2014 14:53)niwax schrieb:  Ohne Unrolling hättest du enormen Overhead weil nach jeder Ausführung von zwei oder drei Instruktionen zuerst noch eine Manipulation an der Schleifenvariablen kommt dann ein GOTO, das dazu auch noch konditional ist.
die Schleifenvariable muss ja auch im entrollten Zustand zwischen den einzelnen Schritten noch iteriert werden
Nein, da das Unrolling meistens nur geht, wenn die Grenzen der Schleife schon bekannt sind, können einfach die entsprechenden Zahlen eingesetzt werden. In diesem Beispiel können zB sogar auch Speicherzugriffe in der Tabelle vereinfacht werden.

Dabei spart man sich zwei Dereferenzierungen pro Zugriff und der Compiler kann sogar im voraus kleinere Puffer aus den Konstanten vorberechnen. Am Ende liegen auch nur 192 Multiplikationen im Cache.

(19.02.2014 16:41)oreissig schrieb:  
(19.02.2014 14:53)niwax schrieb:  Von dem verbrauchten Cache ergibt sich kaum ein Unterschied, da Code bei dem sich das Unrolling lohnt meistens nur ein paar Instruktionen hat.
Wie viel Platz belegt wird, hängt auch von der Anzahl der Schleifendurchläufe ab.
Natürlich, aber durch die kleine Größe wird der Cache dadurch bei weitem nicht voll. 64x256 Bit sind immer noch erst 2 KByte. Damit das dem Cache gefährlich wird, musst du schon auf ner sehr alten Architektur arbeiten.


19.02.2014 17:28
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Blue Offline
Seit dem 17.10.2006 dabei!

Beiträge: 21.533
Registriert seit: Jul 2008
Beitrag #12
RE: Welche Art von Optimierungen nehmen moderne Compiler vor?
selbst ein pentium 1 hat 16kb l1 cache
19.02.2014 20:48
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
oreissig Offline
Maître Modérateur

Beiträge: 12.021
Registriert seit: Jul 2008
Beitrag #13
RE: Welche Art von Optimierungen nehmen moderne Compiler vor?
(19.02.2014 17:28)niwax schrieb:  
(19.02.2014 16:41)oreissig schrieb:  die Schleifenvariable muss ja auch im entrollten Zustand zwischen den einzelnen Schritten noch iteriert werden
Nein, da das Unrolling meistens nur geht, wenn die Grenzen der Schleife schon bekannt sind, können einfach die entsprechenden Zahlen eingesetzt werden.
achso ja in diesem Fall nicht, ich war in Gedanken noch in gandros beispiel, wo stattdessen die Anzahl der Iterationen dezimiert wird

(19.02.2014 17:28)niwax schrieb:  Damit das dem Cache gefährlich wird, musst du schon auf ner sehr alten Architektur arbeiten.
Interessanterweise hat sich der L1-Cache über die Zeit praktisch nie nennenswert erweitert. Die ganz allerersten CPUs, die überhaupt Caches hatten, hatten sowas kleines wie 512B, aber dann hat sich relativ schnell die Größenordnung 16-32kB für je Code und Daten etabliert.
Beim L2 war die Spanne zwar größer, aber auch da gabs vor 20 Jahren locker schon 2MB L2s. Das waren erst noch externe Chips, die erst im Laufe der Zeit aufs Package und dann aufs Die gewandert sind.
(Dieser Beitrag wurde zuletzt bearbeitet: 19.02.2014 22:03 von oreissig.)
19.02.2014 22:03
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
friedrichheinze Offline
...und Kondensatoren.

Beiträge: 2.840
Registriert seit: Jul 2008
Beitrag #14
RE: Welche Art von Optimierungen nehmen moderne Compiler vor?
Ich muss hier gerade mal einen 180 pullen und oreissig recht geben: Auf Sandy Bridge und neuer sollte mal Loops wirklich nicht unrollen. Dort gibt es nämlich einen micro-op cache, der ca 1500 micro-ops speichert, und den sollte man echt sparsam einsetzen.

Wieder was gelernt :)
19.02.2014 22:49
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
thosch97 Offline
All things have a right to grow

Beiträge: 9.843
Registriert seit: Feb 2010
Beitrag #15
RE: Welche Art von Optimierungen nehmen moderne Compiler vor?
(19.02.2014 22:49)friedrichheinze schrieb:  Ich muss hier gerade mal einen 180 pullen und oreissig recht geben: Auf Sandy Bridge und neuer sollte mal Loops wirklich nicht unrollen. Dort gibt es nämlich einen micro-op cache, der ca 1500 micro-ops speichert, und den sollte man echt sparsam einsetzen.

Wieder was gelernt :)

Gentoo Wiki über „Optimierung“ mit -funroll-loops

PGP-Key E384 009D 3B54 DCD3 21BF 9532 95EE 94A4 3258 3DB1 | S/MIME-Key 0x1A33706DAD44DA
G d-@ s+:- a--- C+++ UB+L++ P--- L++@ E-@>++ W+ N o? K? w>++ !O !M !V PS+++ PE-- Y+>++ PGP++>+++ !t 5? X? !R tv b+++>++++ DI !D G>+ e>+++ h !r>++ !z
„Die Aachener gelten als Erfinder des 4. Hauptsatzes der Thermodynamik: ‚Thermo schreibt man zweimal.“‘
“Saying that Java is good because it works on all platforms is like saying oral sex is good because it works on all sexes.”
„Es gibt 10 Sorten von Leuten: Die einen verstehen das Binärsystem, die anderen nicht.“
„Manche Männer lieben Männer, Manche Frauen eben Frauen; Da gibt's nix zu bedauern und nichts zu staunen; Das ist genau so normal wie Kaugummi kauen; Doch die meisten werden sich das niemals trauen“
19.02.2014 22:52
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste