Forum: Compiler & IDEs Codersourcery und Code Composer


von CortexA8 (Gast)


Lesenswert?

Hallo,
Mit entsetzen musste ich leider feststellen, dass ein Cortex A8 mit 1.2 
GHz eine richtig lahme Möhre ist. Ich habe daraufhin einmal den 
erzeugten Assemblercode von Codesourcery mit dem Assemblercode vom Code 
Composer verglichen. Der Unterschied ist gewaltig.

Nun zu meiner Frage. Ist es möglich mit dem Code Composer eine Lib zu 
erstellen, die der Linker vom Codesourcery versteht? Meine Versuche 
dahingehend waren leider bisher nicht erfolgreich.

Evtl. hat jemand von Euch dieses Problem schon beantwortet.

Viele Grüße

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

CortexA8 schrieb:
> Mit entsetzen musste ich leider feststellen, dass ein Cortex A8 mit 1.2
> GHz eine richtig lahme Möhre ist.

Im Vergleich zu was?

> Ich habe daraufhin einmal den erzeugten Assemblercode von
> Codesourcery mit dem Assemblercode vom Code Composer verglichen. Der
> Unterschied ist gewaltig.

Von Ausnahmen abgesehen, sollte ein anderer Compiler bestenfalls einen
Unterschied im einstelligen Prozentbereich zur Folge haben. Ich gehe
davon aus, dass Du die Compileroptionen sorgfältig ausgewählt hast.

> Nun zu meiner Frage. Ist es möglich mit dem Code Composer eine Lib
> zu erstellen, die der Linker vom Codesourcery versteht? Meine
> Versuche dahingehend waren leider bisher nicht erfolgreich.

Es müsste zumindest Versionen geben (Linux ABI?), die das
unterstützen. Anderenfalls hätte der Compiler Shootout
(http://hardwarebug.org/2009/08/20/arm-compiler-shoot-out-round-2/)
von Måns Rullgård nicht funktioniert.

Gruß
Marcus

von Random (Gast)


Lesenswert?

Hallo Marcus,
vielen Dank für Deine Antwort.

Marcus Harnisch schrieb:
> Im Vergleich zu was?
Der ARM soll einen VIA C7 1GHz ersetzen.

Marcus Harnisch schrieb:
> Von Ausnahmen abgesehen, sollte ein anderer Compiler bestenfalls einen
> Unterschied im einstelligen Prozentbereich zur Folge haben. Ich gehe
> davon aus, dass Du die Compileroptionen sorgfältig ausgewählt hast.

Ich gehe davon aus, die Compileroptionen richtig gesetzt zu haben. 
Zumindest habe ich mich an die Vorgaben von Mentor gehalten 
(-mfloat-abi=softfp -mfpu=neon -ftree-vectorize). Das Dumme an diesen 
Optionen war im Falle von Codesourcery, daß ich leider nicht um Compiler 
Intrinsics herumgekommen bin.
d = a1[0]*b2[0]+
    a1[1]*b2[1]+
    a1[2]*b2[2]+
    a1[3]*b2[3];
Ich glaube, dass man es einem Compiler nicht einfacher machen kann. Der 
gcc für den VIA hat jedenfalls Gebrauch von der SIMD Einheit 
gemacht...Codesourcery nicht.

Marcus Harnisch schrieb:
> Es müsste zumindest Versionen geben (Linux ABI?), die das
> unterstützen. Anderenfalls hätte der Compiler Shootout
> (http://hardwarebug.org/2009/08/20/arm-compiler-sho...)
> von Måns Rullgård nicht funktioniert.

Danke für den Link.

Viele Grüße

von Random (Gast)


Lesenswert?

Random schrieb:
> Marcus Harnisch schrieb:
>> Es müsste zumindest Versionen geben (Linux ABI?), die das
>> unterstützen. Anderenfalls hätte der Compiler Shootout
>> (http://hardwarebug.org/2009/08/20/arm-compiler-sho...)
>> von Måns Rullgård nicht funktioniert.
>
> Danke für den Link.

Der Vergleich hat doch auf einer Baremetal-Platfrom stattgefunden. Ich 
würde aber gerne den TMS470-Code in einer Lib dem Codesourcery, mit dem 
Ziel ein ARM GNU/LINUX Programm zu erstellen, zu Verfügung stellen.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Random schrieb:
> Das Dumme an diesen Optionen war im Falle von Codesourcery, daß ich
> leider nicht um Compiler Intrinsics herumgekommen bin.
> d = a1[0]*b2[0]+
>     a1[1]*b2[1]+
>     a1[2]*b2[2]+
>     a1[3]*b2[3];
> Ich glaube, dass man es einem Compiler nicht einfacher machen kann. Der
> gcc für den VIA hat jedenfalls Gebrauch von der SIMD Einheit
> gemacht...Codesourcery nicht.

Und der TI Compiler? Mir ist nicht ganz klar, was Du jetzt eigentlich
vergleichst. VIA/ARM, GCC/CCS?

Es geht Dir also offenbar darum, NEON effizient einzusetzen. Der
auto-vectorizer des GCC unterstützt die ARM Architektur noch nicht so
lange und kann daher möglicherweise nicht mit kommerziellen Compilern
mithalten. Evtl gibt -ftree-vectorizer-verbose Dir ein paar hilfreiche
Informationen, wie man den Code umstellen könnte. Insbesondere handelt
es sich beim obigen Ausdruck anscheinend um eine manuell abgerollte
Schleife. Das könnte den Optimizer verwirren. Kannst Du mehr Code
zeigen? Um was für Datentypen handelt es sich dabei überhaupt?

Auch hilfreich: 
http://infocenter.arm.com/help/topic/com.arm.doc.dht0004a/index.html

Random schrieb:
> Der Vergleich hat doch auf einer Baremetal-Platfrom stattgefunden.

Woher weißt Du das?

Gruß
Marcus

von Random (Gast)


Lesenswert?

Marcus Harnisch schrieb:
> Und der TI Compiler? Mir ist nicht ganz klar, was Du jetzt eigentlich
> vergleichst. VIA/ARM, GCC/CCS?
>
> Es geht Dir also offenbar darum, NEON effizient einzusetzen. Der
> auto-vectorizer des GCC unterstützt die ARM Architektur noch nicht so
> lange und kann daher möglicherweise nicht mit kommerziellen Compilern
> mithalten. Evtl gibt -ftree-vectorizer-verbose Dir ein paar hilfreiche
> Informationen, wie man den Code umstellen könnte. Insbesondere handelt
> es sich beim obigen Ausdruck anscheinend um eine manuell abgerollte
> Schleife. Das könnte den Optimizer verwirren. Kannst Du mehr Code
> zeigen? Um was für Datentypen handelt es sich dabei überhaupt?

Hallo,
ich bin mittlerweile weiter gekommen. So ein ARM ist wohl leider eine 
Performance-Gurke. Da hilft auch ein anderer Compiler leider nichts. Ich 
habe heute einige Funktionen in Assembler geschrieben um die 
SIMD-Einheit (alias NEON) zu verwenden. Der Performance-Gewinn bewegt 
sich um den Faktor 5. Allerdings wird trotzdem nicht die Geschwindigkeit 
erreicht, den ein VIA C7, den der ARM ersetzen soll, erzielt. TI hat 
beim AM389x ein wirklich tolles Paket um den Cortex geschnürt, nur 
leider bleibt der ARM der Flaschenhals. Schade eigentlich.

Viele Grüße

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Random schrieb:
> So ein ARM ist wohl leider eine Performance-Gurke.

Ich glaube, dass uns Deine wiederholte Polemik nicht viel weiter
bringt.

> Da hilft auch ein anderer Compiler leider nichts.

Sag' ich ja.

> Ich habe heute einige Funktionen in Assembler geschrieben um die
> SIMD-Einheit (alias NEON) zu verwenden. Der Performance-Gewinn
> bewegt sich um den Faktor 5.

Prima. Vielleicht ist da sogar noch mehr drin. Und dann kann man u.U.
noch Speicherzugriffe optimieren. Ich habe in der Vergangenheit recht
erfolgreich Codeoptimierungen auf ARM Prozessoren vorgenommen.

> Allerdings wird trotzdem nicht die Geschwindigkeit erreicht, den ein
> VIA C7, den der ARM ersetzen soll, erzielt.

Ist das Kriterium "so schnell wie C7", oder "schnell genug, die
Aufgabe in einer bestimmten Zeit zu bewältigen"? Bei ersterem sehe ich
in der Tat ein Problem. Ohne die Implementierung des C7 zu kennen
würde ich bei gleicher Taktfrequenz den Vorteil auf Seite des C7
gegenüber Cortex-A8 sehen. Ist eben an eine andere Zielgruppe
gerichtet.

Viele Grüße
Marcus

von Random (Gast)


Lesenswert?

Hallo Markus,

Marcus Harnisch schrieb:
> Ich glaube, dass uns Deine wiederholte Polemik nicht viel weiter
> bringt.

Ich wollte lediglich meiner Enttäuschung Ausdruck geben.

Marcus Harnisch schrieb:
> Ist das Kriterium "so schnell wie C7", oder "schnell genug, die
> Aufgabe in einer bestimmten Zeit zu bewältigen"? Bei ersterem sehe ich
> in der Tat ein Problem. Ohne die Implementierung des C7 zu kennen
> würde ich bei gleicher Taktfrequenz den Vorteil auf Seite des C7
> gegenüber Cortex-A8 sehen.

Der Arm soll den C7 ersetzen. Allerdings wird er voraussichtlich nicht 
von mir programmiert. Deshalb wird hardwarenahe Programmierung wohl zum 
K.O.- Kriterium werden.

Was ich erstaunlich finde: Der ARM soll bezogen auf MIPS/MHz  deutlich 
schneller als der VIA sein (ARM 2.0 MIPS/MHz Via 1.4 MIPS/MHz. Quelle: 
http://en.wikipedia.org/wiki/Million_instructions_per_second#Million_instructions_per_second). 
Ich weiss, dass MIPS so eine Sache sind, bin aber doch überrascht, dass 
der VIA deutlich schneller ist.

Zur Zeit habe ich die Speicherzugriffe in Verdacht.

Viele Grüße

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

DMIPS Zahlen sind relativ aussagelos. Allerdings soll sich Cortex-A8
auch beim 7-Zip Benchmark ganz gut schlagen: http://www.7-cpu.com/

Random schrieb:
> Zur Zeit habe ich die Speicherzugriffe in Verdacht.

Bei modernen CPUs ist das meistens der Fall. Mit Kenntnis des
Speicheraufbaus des SoC, und der Cachearchitektur lässt sich hier viel
rausholen.

Allerdings gibt es beim Cortex-A8 und NEON Code auch einige Dinge zu
beachten. Bei diesem Prozessor (im Gegensatz zum Cortex-A9) ist NEON
hinten an die Pipeline rangeflanscht. Sowohl das Alignment der NEON
Speicherzugriffe, als auch der Datenfluss zwischen NEON und Core
Registern haben Einfluss auf die Arbeitsgeschwindigkeit.

Wenn es sich, wie es scheint, um ein kommerzielles Produkt handelt,
können wir uns gerne per PN weiter unterhalten.

Gruß
Marcus

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Marcus Harnisch schrieb:
> Random schrieb:
>> Da hilft auch ein anderer Compiler leider nichts.
>
> Sag' ich ja.

Für weitere Anregungen siehe auch:
http://www.doulos.com/knowhow/arm/using_your_c_compiler_to_exploit_neon

--
Marcus

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.