PandoraSuechtig said:
nur einen Kommentar auf einer Seite finden, dass es von der Performance ernüchternd sei (Java auf Jazelle). Hier scheinen die JIT-Compiler der JRE Jazelle überflüssig gemacht zu haben. Daher auch mehr eine Altlast in der Cortex?
Die Jazelle-Geschichte ist noch relativ neu, vielleicht mit dem ARM11 aufgekommen, insofern kann man nicht von Altlast reden. Ich habe aber auch gehört, dass das nicht so der Bringer sein soll.
Schätze der Geschwindigkeitsschub wenn man die DSPs oder NEON nutzt wird mehr als Faktor 10 zu reinem ARM code sein?
Tja, kommt darauf an, was man macht. Der DSP wird sicherlich teilweise mehr als einen Faktor 10 ausmachen, allein schon, weil er wohl lokales dual-ported RAM hat (Werte zero waitstates lesen und im selben Takt auch noch aufs RAM schreiben, ist schon nett), dafür muss der Code aber einen speziellen Umgang mit den Daten haben, weil das lokale RAM normalerweise nur so 256K groß ist. Dann kann der DSP Operationen wie einen multiply-accumulate in einem Takt (der aktuelle ARM-Befehlssatz hat aber auch ein paar DSP-typische Instruktionen) und ist vermutlich auch noch mehrfach superskalar (habe die TI-DSPs nicht verfolgt, aber schon vor über zehn Jahren gab es die achtfach superskalar). Für richtige Signalverarbeitung, wo mal eben eine DCT hermuss, wird der Faktor weit über 10 liegen. Dafür kann man den DSP wohl kaum ohne Klimmzüge für gewöhnlichen Code hernehmen. NEON wird ungefähr so wie MMx sein. Wenn man Code speziell dafür schreibt und viele gleichartige Werte parallel verarbeitet, wird das sicherlich einen ordentlichen Schub bringen. Paradebeispiel wären pixelbasierte Operationen.
Wieviel bringt aber eurer Erfahrung nach alleine schon das Optimieren vom ARM code? Insbesondere den angeblich schwachen Output vom ARM-GCC?
Ich habe in meinen Coder-Zeiten immer gesagt, dass ich jeden vom Compiler produzierten Code noch einmal um den Faktor 2 beschleunigen kann. In Assembler kann man einfach optimiert programmieren, in einer Hochsprache hat man zu wenig Kontrolle über das Ergebnis. Z.B. habe ich auf dem 68020/030 mal eine komplette Texturemappingroutine geschrieben, die exakt in die 256 Bytes (ja, Bytes!) Instruction Cache des Prozessors passte. Das hat natürlich ungemein viel ausgemacht. Wir haben damals auf einem 50 MHz 68030 gut 25.000 Polygone pro Sekunde gezeichnet.
Oft gehen also viel größere Beschleunigungsfaktoren als 10, dann sind aber meist auch algorithmische Änderungen dabei. Z.B. habe ich mal einen Code beschleunigt, der im YUV-Format abgelegte Pixel umorganisieren sollte (der mplayer-Codec hat Y, U und V jeweils in getrennten Speicherbereichen abgelegt, der Grafikpuffer wollte aber immer jeweils einen Y-Wert gefolgt von einem U oder V-Wert). Meine erste Änderung an dem Code war, immer gleich acht Pixel gleichzeitig zu bearbeiten, während im C-Code jeweils nur ein Pixel auf einmal benutzt wurde. Das bringt eine Menge, macht den Code aber weniger allgemein, weil nur noch Pixelzahlen mit einem Vielfachen von 8 verarbeitet werden können, was aber in der Praxis immer der Fall war.
Dann sollte der Code auch monochrome Bilddaten verarbeiten können. Im C-Code wurde daher in der Schleife jeweils ein Test gemacht, ob gerade monochrome Daten verarbeitet werden oder nicht. Da diese Frage für einen kompletten Durchlauf immer identisch beantwortet wird, habe ich den Code umgestellt:
for (Pixel) {
bla;
if(monochrome) {
blub; } else {
blib; }
}
wurde einfach zu:
if(monochrome) {
for (Pixel) {
bla;
blub;
}
} else {
for (Pixel) {
bla;
blib;
}
}
(C-ähnlicher Pseudocode...)
Solche Optimierungen kann man auch in einer Hochsprache machen, ein Compiler bekommt das normalerweise nicht hin, weil er nicht das notwendige Wissen über die Randbedingungen hat. Wichtig ist vor allem, dass man beim Programmieren immer im Kopf behält, wie der Code nachher in Assembler aussieht, dann kann man auch gleich in der Hochsprache schlauer programmieren. Aber gerade gute Parallelisierung ist dennoch in einer Hochsprache recht schwierig zu machen.
EDIT: ach so, wenn es ein interessantes Projekt gibt, an dem jemand arbeitet, und derjenige beim Profiling feststellt, dass an irgendwelchen kleineren Stellen zuviel Geschwindigkeit verloren geht, kann er sich ja mal an mich wenden. Vielleicht habe ich dann gerade mal ein bisschen Zeit (und eine Pandora zum Testen (vielleicht geht der Code aber auch auf meiner Archos 5, die auch einen OMAP hat)), den Code in Assembler neu zu fassen und zu optimieren. Prinzipiell macht mir so etwas Spaß. Die genannte YUV-Geschichte kam auch auf diese Weise zu mir...