In einer Diskussion hat sich uns folgende Frage gestellt: Welche Operation wird auf einem Cortex-A schneller ausgeführt? Ein Sprung oder eine FPU-Multiplikation. Das hat sich aus der Frage ergeben, ob man in Simulink eher Schalter (Switches) oder Gains (mit Verstärkung von 0 oder 1) zum Ein- und Ausschalten von Modulen nutzt.
Danish schrieb: > In einer Diskussion hat sich uns folgende Frage gestellt: Welche > Operation wird auf einem Cortex-A schneller ausgeführt? Ein Sprung oder > eine FPU-Multiplikation. Was spricht gegen ausprobieren? > Das hat sich aus der Frage ergeben, ob man in Simulink eher Schalter > (Switches) oder Gains (mit Verstärkung von 0 oder 1) zum Ein- und > Ausschalten von Modulen nutzt. Nachdem sich in Simulink hinter einem "Schalter" oder einem "Gain" garantiert viel mehr versteckt, als "nur" ein Sprung oder "nur" eine Multiplikation, ist m.E. diese Fragestellung im Prinzip unzulässig vereinfacht.
:
Bearbeitet durch Moderator
Beitrag #6362112 wurde vom Autor gelöscht.
Lothar M. schrieb: > Nachdem sich in Simulink hinter einem "Schalter" oder einem "Gain" > garantiert viel mehr versteckt, als "nur" ein Sprung oder "nur" eine > Multiplikation, ist m.E. diese Fragestellung im Prinzip unzulässig > vereinfacht. Naja...
1 | /* Model step function */ |
2 | void switch_vs_gain_step(void) |
3 | { |
4 | /* Switch: '<Root>/Switch' incorporates: |
5 | * Inport: '<Root>/sw_in' |
6 | */ |
7 | if (switch_vs_gain_U.sw_in > 0.0) { |
8 | /* Outport: '<Root>/sw_out' incorporates: |
9 | * Constant: '<Root>/Constant' |
10 | */ |
11 | switch_vs_gain_Y.sw_out = 2.0; |
12 | } else { |
13 | /* Outport: '<Root>/sw_out' incorporates: |
14 | * Constant: '<Root>/Constant1' |
15 | */ |
16 | switch_vs_gain_Y.sw_out = 3.0; |
17 | } |
18 | |
19 | /* End of Switch: '<Root>/Switch' */ |
20 | |
21 | /* Outport: '<Root>/gain_out' incorporates: |
22 | * Gain: '<Root>/Gain' |
23 | * Inport: '<Root>/gain_in' |
24 | */ |
25 | switch_vs_gain_Y.gain_out = 0.0 * switch_vs_gain_U.gain_in; |
26 | } |
Ein Gain von 1 wird übrigens gänzlich wegoptimiert. Ein Gain von 0 leider nicht. Lothar M. schrieb: > Was spricht gegen ausprobieren? Werde ich bei Gelegenheit machen.
Danish schrieb: > Welche Operation wird auf einem Cortex-A schneller ausgeführt? Ein > Sprung oder eine FPU-Multiplikation. Welcher Cortex-A genau? Da gibt es viele verschiedene von. Ist es eine SIMD-Multiplikation? Single oder Double Precision? Ist das Sprungziel nahe und im Cache? Ist die Sprungbedingung schon länger vor dem Branch-Befehl bekannt, oder erst direkt davor? Ist es überhaupt ein Sprung und nicht nur eine bedingte Ausführung per Condition Code? Welcher Instruction Set (T32/A32/A64)? Ist die Branch Prediction und Cache aktiv? Müssen für die Multiplikation vielleicht noch Daten aus dem RAM geladen werden? Solche Prozessoren sind so komplex, da kann man einzelne Befehle kaum vergleichen. Da ist es einfacher es auszuprobieren.
Danish schrieb: > Ein Gain von 0 > leider nicht. Solange du deinen Compiler nicht selbst geschrieben hast, wird der eine Multiplikation mit 0 sicher optimieren.
:
Bearbeitet durch User
Danish schrieb: > Ein Sprung oder eine FPU-Multiplikation. Weder noch. ARMv8 hat mit FCSEL einen Befehl der Art A = condition ? B : C Wobei man so etwas auch gerne mit Bitmasken und AND/BIC/OR erledigt. Weshalb es neben Vergleichsbefehlen, die Flags erzeugen, auch welche gibt, die Bitmasken 0/~0 erzeugen. Wenn also die Bedingung nicht vor vorneherein feststeht und damit vom Compiler abgehakt wird, kann man früh die Masken vorbereiten und muss sie dann an der kritischen Stelle nur nutzen. Hat man es wirklich eilig, und nur wenig solche Switches aber viele Daten, dann könnte man auch auf die Idee kommen, nicht für jeden einzelnen Wert zu entscheiden, sondern mehrere Codepfade zu nutzen, die jeweils alle Daten en bloc abhandeln.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.