In meiner Klasse für eingebettete Systeme wurden wir gebeten, die gegebene C-Funktion AbsVal in ARM Assembly umzucodieren. Uns wurde gesagt, dass das Beste, was wir tun konnten, 3 Zeilen war. Ich war entschlossen, eine 2-Linien-Lösung zu finden und schließlich tat, aber die Frage, die ich jetzt habe, ist, ob ich tatsächlich die Leistung verringert oder erhöht es.ARM Assembly: Absoluter Wert Funktion: Sind zwei oder drei Zeilen schneller?
Der C-Code:
unsigned long absval(signed long x){
unsigned long int signext;
signext = (x >= 0) ? 0 : -1; //This can be done with an ASR instruction
return (x + signet)^signext;
}
Die 3-line-Lösung von TA/Professor
ASR R1, R0, #31 ; R1 <- (x >= 0) ? 0 : -1
ADD R0, R0, R1 ; R0 <- R0 + R1
EOR R0, R0, R1 ; R0 <- R0^R1
Meine 2-Line-Lösung
ADD R1, R0, R0, ASR #31 ; R1 <- x + (x >= 0) ? 0 : -1
EOR R0, R1, R0, ASR #31 ; R0 <- R1^(x >= 0) ? 0 : -1
Es gibt ein paar Orte, die ich mögliche Leistungsunterschiede sehen:
- Die Zugabe eines zusätzlichen Arithmetic Rechts Anruf
So holen
Warum nicht Benchmarks? Das ist der sicherste Weg, den Leistungsunterschied zu kennen. – jpaugh
Ich würde das total machen, aber ich werde nur in diese Konzepte eingeführt. Ich kann den Prof bitten, mir bei einem Benchmark zu helfen, aber vor allem zu wissen, warum es schneller oder langsamer sein soll, ist mein Ziel. Nicht sicher, ob Benchmarking die Phasenzeit abrufen/ausführen zeigt oder Register/ALU-Zugriffe –
Es hängt von den Implementierungen ab. Kerne vor A8 werden Ihren Code wahrscheinlich schneller ausführen, die Verschiebung ist normalerweise kostenlos, es sei denn, Ihr Verschiebewert befindet sich in einem Register. A8 und neuere Kerne haben mehrere Pipelines, die eine parallele Ausführung erlauben könnten, die beide sogar in Zyklen machen könnten, Sie könnten http://pulsar.webshaker.net/ccc/result.php?lng=us ausprobieren. –