Forum: Mikrocontroller und Digitale Elektronik Cortex A: Sprung vs. FPU Multiplikation


von Danish (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.
von Danish (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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.

von Felix U. (ubfx)


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?

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
Noch kein Account? Hier anmelden.