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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Danish (Gast)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.