Forum: Compiler & IDEs GCC-ARM -O3 (nicht-)Performance


von Nop (Gast)


Lesenswert?

Hi,

ich habe eine merkwürdige Beobachtung beim GCC gemacht. Daß -O3 aufs 
ganze Programm Geschwindigkeit kosten kann, kenne ich ja von x86 - 
Stichwort anwachsende Programmgröße vs. CPU-Cache. Also compiliere ich 
global gesehen mit -O2.

Es gibt aber auch Pragmas, mit denen man den GCC zu Optimierung nur 
ausgewählter Code-Passagen anweisen kann. Das habe ich auch gemacht - 
nichts Wildes, nur z.B. eine oft aufgerufene Funktion mit einem 
Shellsort, die ich per Pragma auf -O3 gesetzt habe.

Auf x86 bringt das eine meßbare Beschleunigung, weil die Routine klein 
genug bleibt, um kein Cacheproblem zu erzeugen. Auf ARM Cortex M4 
hingegen bringt das eine Verlangsamung, obwohl der nichtmal einen Cache 
in dem Sinne hat. Ich habe auch ansonsten beim ARM-GCC auf Cortex-M4 
noch kein Beispiel oder Codefragment gehabt, wo -O3 die Sache nicht 
gegenüber -O2 verlangsamt hätte.

Ist das ein bekannter Defekt beim ARM-GCC? -O3 wäre damit ja eigentlich 
völlig sinnlos, weil es die Codegröße aufbläht UND den Code auch noch 
verlangsamt.

Oder habe ich einfach nur die ganzen Pechtreffer gehabt, während andere 
da ein glücklicheres Händchen hatten? Wie sind Eure Erfahrungen mit 
ARM-GCC, -O3 und Cortex-M?

von Dr. Sommer (Gast)


Lesenswert?

Nop schrieb:
> Auf ARM Cortex M4 hingegen bringt das eine Verlangsamung, obwohl der
> nichtmal einen Cache in dem Sinne hat.

Die STM32F4 schon, da der langsame Flash Speicher den Code bremst. 
Versuch vielleicht mal den Vergleich bei Codeausführung im RAM, um 
diesen Effekt auszublenden.

von Nop (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Die STM32F4 schon, da der langsame Flash Speicher den Code bremst.

Das kann natürlich sein, obwohl deren ART mit dem Prefetcher ja 
eigentlich diesen Effekt weitgehend ausschließt und GCC auch die Option 
-mslow-flash (oder so) kennt.

> Versuch vielleicht mal den Vergleich bei Codeausführung im RAM, um
> diesen Effekt auszublenden.

Das wird die Sache nur noch mehr runterreißen. In ST-Foren habe ich das 
jedenfalls gelesen. Zwar hat das RAM keine Waitstaites, aber dann gehen 
Daten und Instruktionen letztlich über denselben Bus (weil: in denselben 
Speicherbereich), so daß die Architektur mit parallelem Daten- und 
Instruktionsbus nicht mehr geht wie geplant. Ergebnis ist 
Busverstopfung, weswegen RAM-Code eher langsamer läuft.

ST empfiehlt das daher nicht. Natürlich mit der Ausnahme, daß man das 
Flash beschreiben will, dieser Code kann nur aus dem RAM laufen. Aber 
das ist dann ja nicht wegen der Geschwindigkeit.

von Jim M. (turboj)


Lesenswert?

Hast Du mal "-mslow-flash-data" probiert? Das kam mit gcc 4.9 Release.

Flash ist bei Cortx M4 fast immer mit einem kleinen Cache beschleunigt.

Nop schrieb:
> Zwar hat das RAM keine Waitstaites, aber dann gehen
> Daten und Instruktionen letztlich über denselben Bus

Richtige(tm) MCUs haben dafür auch RAM im 0x10000000 Bereich, der über 
die Code/Daten Busse angesprochen wird. Dann bleibt der System Bus frei.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> ich habe eine merkwürdige Beobachtung beim GCC gemacht. Daß -O3 aufs
> ganze Programm Geschwindigkeit kosten kann

Ist eine nicht ganz neue Erkenntnis. Die mitunter auch schon -Os 
schneller als -O1 werden liess.

Die höheren Optimierungsgrade von GCC sind nicht speziell für 
Mikrocontroller implementiert worden, sondern kommen eher aus dem 
Bereich der Highend-Maschinen. Wobei auch da ein höherer 
Optimierungsgrad nur garantiert, dass der Compiler sich mehr Arbeit 
macht. Nicht aber, dass das Ergebnis wunschgemäss ausfällt.

Wenn bei einem µCs -O3 langsamer als -O2 ausfällt, dass raubt das den 
Maintainern des Compilers garantiert nicht den Schlaf.

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

Jim M. schrieb:

> Hast Du mal "-mslow-flash-data" probiert? Das kam mit gcc 4.9
> Release.

Klar, das hab ich drin, seitdem es das gibt; derzeit setze ich 5.3 Q2 
ein. Allerdings sagt die Doku zu der Option, daß es das Laden von 
Immediates aus dem Flash minimiert. Klingt also so, als würde sich das 
eben nur auf Daten und nicht auf Code beziehen. Man bräuchte wohl auch 
noch ein "-mslow-flash-code".

> Flash ist bei Cortx M4 fast immer mit einem kleinen Cache beschleunigt.

Außer dem Prefetcher, der sich gleich 128bit auf einmal aus dem Flash 
zieht, gibt's auch noch den Dcache und den Icache, die man im Flash-ACR 
einstellen kann, ja.

Nur, das sind keine Caches im Sinne von x86-CPUs, wo komplette 
nennenswerte Routinen reinpassen. Es werden nichtmal Caches im 
kB-Bereich sein.

Aber hat mal jemand mit -O3 auf Cortex-M4 (speziell, in der Tat STM32F4) 
positive praktische Erfahrungen gemacht? Also daß es schneller wird?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.