Forum: Mikrocontroller und Digitale Elektronik Controller mit FPU


von Peter Daniel (Gast)


Lesenswert?

Hallo Zusammen

Bei all meinen Projekten kam ich bisher um das Rechnen mit 
Gleitkommazahlen herum. Habe das immer möglichst vermieden.

Falls eines das Gefühl hat, er müsse etwas vonwegen Hausaufgaben 
schreiben: Lasst gut sein. Ich studiere in eine Komplett andere Richtung 
und Elektronik ist ein Hobby von mir. Die fragen basieren alle auf 
meiner persönlichen neugierde.

Für mein neustes Projekt dass ich anstrebe, wird das allerdings 
nichtmehr gehen. Seit einiger Zeit gibt es nun Controller mit 
integrierter FPU. Dazu stellen sich mir nun einige Fragen:

- Macht eine solche FPU einen grossen Zeitunterschied bei der Rechnung 
mit Gleitkommazahlen? (Beispielsweise Berechnung eines Sinus)

- Bietet Microchip solche Controller mit FPU an? Zumindest für ihre 
32-Bit Controller Serie finde ich da nichts... alles was ich dazu 
gefunden habe war eine Floating Point Math Library:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en552826

Wäre da eine FPU schneller? Sinusberechnungen brauchen bei der Lib 
Beispielsweise 299 Zyklen... Da eine FPU allerdings Hardware ist, dürfte 
dich nochmal um einiges schneller sein oder irre ich mich da?

- Wie muss man sich das ganze vorstellen bezüglich der Programmierung? 
Reicht es da, die FPU zu aktivieren und sämtliche Berechnungen werden 
dann damit ausgeführt, oder muss sowas speziell im Code erwähnt werden?
(Ich weiss, ich könnte ein Datenblatt lesen und ein Unterschied bei den 
meisten Herstellern ist bestimmt auch vorhanden, es geht mir hierbei 
aber nicht um eine exakte Beschreibung wie ich sowas anzuwenden habe 
sondern eher um eine kleine Beschreibung, damit ich mir besser 
Vorstellen kann was eine FPU ist und wie diese in einem uC integriert 
ist).

- Es existieren so wie ich das gesehen habe auch externe FPU's... lohnt 
sich sowas? Schliesslich müsste man die Daten ja auch erst einmal 
übertragen usw. Bei dem Projekt geht es um die Berechnung mehrer Kalmann 
Filter, das ganze sollte möglichst schnell laufen.

Das wars erst einmal Fragen zur FPU.
-------------------------------------------

Eine generelle Frage, ich mir in den Sinn gekommen ist während dem 
schreiben:

Mir ist aufgefallen, dass viele Hersteller mittlerweile einige CPU's mit 
FPU anbieten... ausser Microchip. Zumindest nicht auf der 32-Bit Serie. 
Generell habe ich das Gefühl, dass immer weniger Leute auf PIC's setzen. 
Hat das seine Gründe? Sind die Controller schlechter / weniger weit 
entwickelt als diejenigen der Konkurrenz?

Falls dem so sei, welche Hersteller sind denn relativ "aktuell." ?
AVR ist hier ja relativ weit verbreitet, doch wie siehts mit STM usw. 
aus?
Für die Beantwortung dieser Frage reicht mir sonst auch ein Link, bei 
dem ich mich dann selbst einlesen kann.

Vielen dank für jeden der sich Zeit nimmt.

von Purzel H. (hacky)


Lesenswert?

Ja eine FPU beschleunigt floating point, kostet Geld, kostet Strom. 
Wieviel von jedem steht jeweils im Datenblatt.

Wozu brauchst du eine FPU ? Fuer'n Sinus braucht man's nicht.

Falls doch, sollte man sich von einer Modellreihe, die das eben nicht 
bietet loesen koennen. Eine FPU muss man nicht einschalten, sondern per 
code ansprechen. Der passende Compiler macht das dann schon.

Falls PIC32 keine FPU haben kann. hat zumindet AVR32 ein modell. Dann 
gibt es diverse andere Controller, zB Blackfin, Cortex

von m.n. (Gast)


Lesenswert?

Peter Daniel schrieb:
> Bei all meinen Projekten kam ich bisher um das Rechnen mit
> Gleitkommazahlen herum. Habe das immer möglichst vermieden.

Laß mich raten: Du vermeidest auch Bus, Bahn oder Flieger und gehst alle 
Strecken zu Fuß?

Wenn Du float-Berechnungen brauchst, dann nimm sie. Falls Dein 
Controller zu langsam ist, float per Software auszurechnen, dann nimm 
einen mit FPU.
Wo ist das Problem?

Selbst ein AVR rechnet locker mit float- (32Bit) oder auch double-Werten 
(64Bit) hinreichend schnell, sodaß es keinen Grund gibt, darauf zu 
verzichten.

von (prx) A. K. (prx)


Lesenswert?

m.n. schrieb:
> Selbst ein AVR rechnet locker mit float- (32Bit) oder auch double-Werten
> (64Bit)

Ist double beim avr-gcc mittlerweile 64 Bits breit?

von Falk B. (falk)


Lesenswert?

@ Peter Daniel (Gast)

>- Macht eine solche FPU einen grossen Zeitunterschied bei der Rechnung
>mit Gleitkommazahlen? (Beispielsweise Berechnung eines Sinus)

Ja. Wobei man einen Sinus leicht und schnell aus einer Tabelle rausholen 
kann.

>- Bietet Microchip solche Controller mit FPU an? Zumindest für ihre

Keine Ahnung. Diverse ARM der gehobenen Klasse haben eine FPU.

>Wäre da eine FPU schneller? Sinusberechnungen brauchen bei der Lib
>Beispielsweise 299 Zyklen... Da eine FPU allerdings Hardware ist, dürfte
>dich nochmal um einiges schneller sein

Ja.

>- Wie muss man sich das ganze vorstellen bezüglich der Programmierung?
>Reicht es da, die FPU zu aktivieren und sämtliche Berechnungen werden
>dann damit ausgeführt,

Ja.

>sondern eher um eine kleine Beschreibung, damit ich mir besser
>Vorstellen kann was eine FPU ist und wie diese in einem uC integriert
>ist).

Eine FPU ist ein mathematischer Koprozessor, also ein Stück Hardware, 
welche die Fließkommarechungen macht. Der C Compiler kümmert sich darum, 
dass deine Fließkommarechungen in passenden Code umgesetzt werden. In 
ASm nutzt man eine FPU nur selten.


>- Es existieren so wie ich das gesehen habe auch externe FPU's... lohnt
>sich sowas?

Nein. Das war vor 20 Jahren mal so.

>Generell habe ich das Gefühl, dass immer weniger Leute auf PIC's setzen.

Das ist rein subjektiv. Ich glaube Microchip macht noch ganz gut Umsatz 
mit seinen vielen VERSCHIEDENEN PICs.

von Jan B. (berge)


Lesenswert?

Moin Peter,

STM ist hier mittlerweile auch recht verbreitet, wie du auch an der 
Anzahl der STM bezogenen Titel im Forum siehst. Von ST gibt es die 
STM32F4 mit FPU. Zur FPU Performance kann ich (noch) nichts sagen, da 
ich nur ein paar Floats habe und die in SW ausreichend schnell 
erschlagen werden.

Bzgl. deiner generellen FPU Fragen: Bei vorhandener FPU kann der 
Compiler Fließkommaberechnungen einfach in wenige (schnelle) FPU Befehle 
statt in hunderte Software Instruktionen umsetzen. Dazu muss der 
Compiler nur wissen, dass eine FPU vorhanden ist und er sie nutzen soll. 
Und du solltest sie im Code natürlich aktivieren ;)

Liebe Grüße,

Jan

von m.n. (Gast)


Lesenswert?

A. K. schrieb:
> Ist double beim avr-gcc mittlerweile 64 Bits breit?

Das glaube ich nicht, bin mir aber nicht sicher.
Für 'echte' double nehme ich IAR.

von Jürgen S. (jurs)


Lesenswert?

Peter Daniel schrieb:
> - Macht eine solche FPU einen grossen Zeitunterschied bei der Rechnung
> mit Gleitkommazahlen? (Beispielsweise Berechnung eines Sinus)

Letztens habe ich mit meinen Arduino-Boards mal ein paar kleine 
selbstgeschriebene Benchmarks laufen lassen und dabei festgestellt, dass 
selbst Controller ohne FPU erhebliche Leistungsunterschiede bei 
Gleitkommarechnungen zeigen können, die sich durch unterschiedliche 
Taktraten nicht erklären lassen, sondern durch die interne Architektur 
des Controllers und seinen Befehlssatz bedingt sind.

Verglichen habe ich mal die Performance:

Atmega328 @16 MHz, "Arduino UNO"
mit
SAM3X @84 MHz, "Arduino DUE"

Der SAM3X ist fast immer nur zwischen 3,5 bis 10 mal schneller als der 
Atmega328, mit identischem Arduino-Testprogramm zum Testen von 
Integerberechnungen und Arrayzugriffen. Soweit normal. Compiler ist auch 
in beiden Fällen der GCC.

Aber beim Testen der Gleitkommarechnungen mit float Variablen ist mir 
aufgefallen, dass der SAM3X sagenhafte 100 mal schneller ist als ein 
Atmega328, wenn der Benchmark hauptsächlich Gleitkommadivisionen 
durchführt.

Testporogramm war dazu die Newton-Approximation für PI:
Pi = 4* (1/1 - 1/3 + 1/5 - 1/7 + 1/9 ...

Obwohl der SAM3X Controller nur ca. 5mal schneller taktet als der 
Atmega328 und ich im Datenblatt nichts von einer FPU sehen kann, kann er 
die Approximation ca. 100 mal schneller rechnen.

Ob es an der 32-Bit Architektur des SAM3X liegt, dass der GCC soviel 
schnelleren Code für Gleitkommadivisionen erzeugen kann als für 8-Bit 
AVR-Controller?

(Arduino-Testprogramm kann ich auf Wunsch zur Verfügung stellen.)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Jürgen S. schrieb:
> Ob es an der 32-Bit Architektur des SAM3X liegt, dass der GCC soviel
> schnelleren Code für Gleitkommadivisionen erzeugen kann als für 8-Bit
> AVR-Controller?

Der SAM3X hat immerhin eine 32/32-Bit-Integer-Division, die er auch
gewinnbringend für 32-Bit-Float-Divisionen einsetzen kann. Ob das
allerdings einen Geschwindigkeitsfaktor von 100 bringt, kann ich nicht
sagen.

von m.n. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Obwohl der SAM3X Controller nur ca. 5mal schneller taktet als der
> Atmega328 und ich im Datenblatt nichts von einer FPU sehen kann, kann er
> die Approximation ca. 100 mal schneller rechnen.

Das kann man doch ganz exakt ausrechnen:
84MHz/16MHz * (32Bit-8Bit) -> 5,25 * 24 = 126.
Das ist der Beweis!

Dass nur Faktor 100 erreicht wird, liegt mit Sicherheit an den 
wait-states des Flash-Speichers :-)

von Olaf (Gast)


Lesenswert?

> sondern eher um eine kleine Beschreibung, damit ich mir besser
> Vorstellen kann was eine FPU ist und wie diese in einem uC integriert
> ist).

Programmierst du in Assembler? Dann darfst du dich natuerlich um alles 
persoenlich kuemmern.
Die meisten Leute programmieren aber in C oder bei so dicken Projekten 
das eine FPU unabdingbar ist gerne auch in C++. Dann macht das der 
Compiler. Du musst da halt nur die richtige CPU einstellen und eventuell 
noch ein Flag mitgeben und danach geht alles.

> Falls dem so sei, welche Hersteller sind denn relativ "aktuell." ?

Der groesste Hersteller ist wohl derzeit Renesas. Allerdings haben die 
das durch Zukaeufe geschafft und deshalb sehr viele unterschiedliche 
Familien.

Viele andere nutzen wohl ARM gerade weil sie nicht die Power haben um 
eigene Compiler und das ganze Tooling selber zu entwickeln.

Olaf

von Jürgen S. (jurs)


Lesenswert?

Yalu X. schrieb:

> Der SAM3X hat immerhin eine 32/32-Bit-Integer-Division, die er auch
> gewinnbringend für 32-Bit-Float-Divisionen einsetzen kann. Ob das
> allerdings einen Geschwindigkeitsfaktor von 100 bringt, kann ich nicht
> sagen.

Oh, oh. Faktor 100 stimmt auch nicht!

Mein Fehler, ich nehme das oben geschriebene zurück, offenbar hat mir 
mein Gedächtnis einen Streich gespielt und ich habe den Faktor 100 mit 
einem anderen Benchmark-Test verwechselt.

Tatsächlich ist es so (und das habe ich jetzt nochmal nachgemessen):
PI-Benchmark auf Atmega328: 4.403720 Sekunden
PI-Benchmark auf SAM3X    : 0.502921 Sekunden

Der Faktor bei der Rechengeschwindigkeit mit float ist also ca. 8,75 und 
liegt damit nur knapp über dem Faktor, den man durch die höhere Taktrate 
von 84 MHz vs 16 MHz erwarten kann.

Sorry, mein Fehler.

Wo es den Faktor 100 bei der Rechengeschwindigkeit gibt, ist tatsächlich 
mein Primzahlen-Benchmark. Mein Test versucht ganz brute-force, 
Primzahlen durch Modulo-Arithmetik zu ermitteln. Es werden alle mögliche 
Teiler zwischen 1 und der zu testenden Zahl ausprobiert, ob "Zahl % 
Teiler ==0" ist. Und bei diesem Prinzahlen-Benchmark gab es den 
Unterschied um Faktor 100. Offenbar ist die Modulo-Arithmetik im SAM3X 
Controller wesentlich scheller implementiert als in den 8-Bit AVRs.

Bei Gleitkommadivisionen mit "float" liegt der echte Vorteil des 32-Bit 
Controllers, wenn man den Vorteil des schnelleren Taktes herausrechnet, 
nur bei
8,75 / 5,25 = ca. 1,67

Also nur um Faktor 8,75 (taktbereinigt Faktor 1,67) schnellere 
Gleitkommadivision mit float.

Und Faktor 100 gilt leider nur für die Modulo-Divisionsrestbestimmung 
mit Integern.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Jürgen S. (jurs)

>Unterschied um Faktor 100. Offenbar ist die Modulo-Arithmetik im SAM3X
>Controller wesentlich scheller implementiert als in den 8-Bit AVRs.

>>Yalu X. (yalu) (Moderator)

>Der SAM3X hat immerhin eine 32/32-Bit-Integer-Division, die er auch
>gewinnbringend für 32-Bit-Float-Divisionen einsetzen kann.

von m.n. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Also nur um Faktor 8,75 (taktbereinigt Faktor 1,67) schnellere
> Gleitkommadivision mit float.

Du magst ein netter Mensch sein, aber das glaube ich nicht.
Kontrolliere bitte, was tatsächlich gerechnet wird. Die Werte für 1/3, 
1/5, 1/7, ... werden sicherlich vom Compiler schon aufgelöst, sodass 
garkeine Divisionen stattfinden, sondern lediglich eine Multiplikation 
mit 4 - wenn überhaupt.
Ferner sieh bitte nach, ob in beiden Programmen die Variablen vielleicht 
mit double deklariert werden. In Folge würde der AVR-GCC mit 32 Bit 
rechnen und der SAM mit richtigen double (64 Bit).
Wenn man am Ende vergleichbaren Code vorliegen hat, sollte wieder ein 
unbereinigter Faktor herauskommen, der deutlich über 8,75 liegt!

von (prx) A. K. (prx)


Lesenswert?

Yalu X. schrieb:
> Der SAM3X hat immerhin eine 32/32-Bit-Integer-Division, die er auch
> gewinnbringend für 32-Bit-Float-Divisionen einsetzen kann.

Sicher? Mit 64:32=>32 kannst du da etwas gewinnen, aber mit 32:32=>32 
kommt auf direktem Weg nichts raus, müsste per Iteration laufen.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Jürgen S. schrieb:
> Der Faktor bei der Rechengeschwindigkeit mit float ist also ca. 8,75 und
> liegt damit nur knapp über dem Faktor, den man durch die höhere Taktrate
> von 84 MHz vs 16 MHz erwarten kann.

Angesichts des doch recht unterschiedlichen Aufwands erscheint das kaum 
glaubhaft. Immerhin muss ein 8-Bitter für eine 24-Bit Mantisse schon bei 
Add/Sub mindestens 3mal so viel rechnen wie ein 32-Bitter. Und das ist 
noch ohne die Shifts gerechnet, die bei die Mantissen angleichen und das 
Ergebnis normalisieren. Die für einen CM3 trivial sind, für einen AVR 
jedoch arg aufwendig.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

A. K. schrieb:
> Yalu X. schrieb:
>> Der SAM3X hat immerhin eine 32/32-Bit-Integer-Division, die er auch
>> gewinnbringend für 32-Bit-Float-Divisionen einsetzen kann.
>
> Sicher? Mit 64:32=>32 kannst du da etwas gewinnen, aber mit 32:32=>32
> kommt bei den üblicherweise normalisierten Mantissen auf direktem Weg
> nichts raus, müsste per Iteration laufen.

Eine 64/32-Division wäre natürlich besser, weil man damit schon mit
einer einzelnen Divison zu Ziel kommt. Von den 32/32-Divisionen braucht
man IMHO 3 Stück, da die Mantisse von 32-Bit-Floats inkl. des impliziten
führenden 1-Bits 24 Bit groß ist. Jede Division berechnet also 8 Bits
des 24-Bit-Ergebnisses. Da die 32/32-Division auf dem M3 nur 2 bis 12
Zyklen dauert, sollte die gesamte Berechnung immer noch deutlich weniger
Zyklen benötigen als auf einem AVR.

Bei Double-Divisionen hilft einem der Divisionsbefehl überhaupt nicht
mehr, aber auch eine 64/32-Bit-Division wäre nutzlos, weil die Mantisse
des Divisors größer als 32 Bit ist. In diesem Fall muss man über alle
Bits der Mantisse des Dividenden iterieren. Da bleibt dem ARM gegenüber
dem AVR nur noch der Vorteil der größeren Wortbreite und der höheren
Taktfrequenz.

von Markus H. (dasrotemopped)


Lesenswert?

damit da keine Verwirrung aufkommt, eine FPU bedeutet nicht, das alle 
mathematischen Funktionen automatisch mit einem Hardwarebefehl abgedeckt 
werden. Es bedeutet nur (Beispiel C), das die math-Lib auf 
Hardwarefunktionen in der CPU zurückgreifen kann, um die Berechnungen zu 
beschleunigen. Wie stark hängt von der Hardware ab, auch der bit-Breite 
der Recheneinheiten (8-bit CPU vs 16  32  usw bit CPU). ieee754 bietet 
eine Normierung, aber im DSP Bereich nimmt man auch gerne andere 
Formate, Schnittmengen nicht ausgeschlossen.

von (prx) A. K. (prx)


Lesenswert?

Yalu X. schrieb:
> Bei Double-Divisionen hilft einem der Divisionsbefehl überhaupt nicht
> mehr,

Wär nicht erstaunt, wenn man den für Newton-Raphson verwenden kann.
http://en.wikipedia.org/wiki/Division_algorithm#Newton.E2.80.93Raphson_division

: Bearbeitet durch User
von P. M. (o-o)


Lesenswert?

m.n. schrieb:
> Selbst ein AVR rechnet locker mit float- (32Bit) oder auch double-Werten
> (64Bit) hinreichend schnell, sodaß es keinen Grund gibt, darauf zu
> verzichten.

Kommt drauf an... Eine Formel, um einen Sensorwert auf einem Display 
auszugeben, wirst du genügend schnell in Float rechnen können. Einen 
Signalgenerator für Audiofrequenzen in Float wird aber im AVR kaum drin 
liegen.

von Peter Daniel (Gast)


Lesenswert?

Scheint als wäre die Frage garnicht so verkehrt gewesen, gibt immerhin 
viel Gesprächsstoff und konnte schon sehr viel lernen.

Vielen dank an alle, die hier geholfen haben! Ich weiss nun eigentlich 
alles was ich wollte, könnt aber gerne weiterdiskutieren. Man kann nie 
genug lernen und das hier ist definitiv besser als jede Literatur!!!

Durch dieses Forum habe ich schon soviel gelernt, danke an euch!

von Yalu X. (yalu) (Moderator)


Lesenswert?

A. K. schrieb:
> Wär nicht erstaunt, wenn man den für Newton-Raphson verwenden kann.

So wurde das u.a. auf dem TMS320C40 gemacht. Der hatte einen Befehl, der
mit Hilfe einer Lookuptabelle einen 8 Bit genauen Näherungswert für den
Kehrwert einer Zahl ermittelt hat. Das Newton-Raphson-Verfahren
verdoppelt mit jedem Iterationsschritt die Anzahl der genauen Bits, so
dass nach zwei Iterationsschritten bzw. 4 MACs das 32-Bit-Float-Ergebnis
dastand. Die FPU eines damals aktuellen PC-Prozessors (i486) hat für
eine Division die 50-fache Zeit benötigt (allerdings rechnete der in
doppelter Genauigkeit).

Auf ähnliche Weise und ähnlich schnell wurden auch Quadratwurzeln
berechnet.

Das Newton-Raphson-Verfahren bringt IMHO aber nur Vorteile, wenn bereits
eine schnelle FP-Multiplikation und -Addition zur Verfügung stehen. Wenn
diese erst mühselig aus Integer-Operationen zusammengesetzt werden
müssen, dürfte die bitweise Division eher schneller sein.

: Bearbeitet durch Moderator
von Jürgen S. (jurs)


Lesenswert?

A. K. schrieb:
> Angesichts des doch recht unterschiedlichen Aufwands erscheint das kaum
> glaubhaft. Immerhin muss ein 8-Bitter für eine 24-Bit Mantisse schon bei
> Add/Sub mindestens 3mal so viel rechnen wie ein 32-Bitter.

Muss er das wirklich?

Haben nicht auch die 8-Bit AVR-Controller mindestens drei 
"Register-Pärchen", in Form des X-, Y- und Z-Registers, in denen zwei 
8-Bit Register zusammengefaßt sind, und die zusammen 16-Bit Register 
bilden?

Ich bin kein Assembler-Programmierer, aber das Instruction-Set der AVR 
8-Bitter ist doch 16-Bit? Und in den 16-Bit Instructions gibt es auch 
welche, die mit den 16-Bit Registern (X-, Y-, Z-Register) arbeiten?

Anyway, das ist der Code, den ich als meinen PI-Benchmark laufen lasse 
(ohne das Arduino-Programm drumherum):
1
#define UINT  uint16_t
2
#define ULONG uint32_t
3
#define FLOAT float
4
#define BYTE uint8_t
5
6
FLOAT piBenchmark(UINT limit)
7
// Benchmark zur nährungsweisen Ermittlung der Zahl PI mittels der Formel:
8
// Pi = 4* (1/1 - 1/3 + 1/5 - 1/7 +1/9 ...)
9
{
10
  FLOAT pi=0.0;
11
  ULONG teiler=1;
12
  BYTE sign=1;  // 1 für Vorzeichen + beim Addieren, 0 für Vorzeichen -
13
  for (UINT i=1;i<10;i++) // Benchmarkschleife zehnmal laufen lassen für längere Messzeit
14
  { 
15
    for (UINT j = 1; j <= limit; j++) 
16
    {
17
      if(sign) 
18
      {
19
        pi += 1/(FLOAT)teiler;
20
        sign=0;
21
      }
22
      else
23
      {
24
        pi-=1/(FLOAT)teiler;
25
        sign=1;
26
      }
27
      teiler+=2;
28
    }
29
  }
30
  return pi * 4.0;
31
}

Der von mir empfohlene Wert für den Parameter "limit" ist 10000, aber 
jeder andere Wert im Bereich einer uint16_t Variablen tut es auch.

So eine Benchmark-Routine testet natürlich nicht ausschließlich die 
Gleitkommaverarbeitung, denn auch wenn diese Routine sehr viele 
Gleitkommaberechnungen ausführt, finden natürlich in den for-Schleifen 
auch Veränderungen des Laufindex und Vergleiche und Verzweigungen statt.

In meinem Arduino-Sketch gibt man den "limit" Parameter als Startwert 
über Serial erst zur Laufzeit des Programms ein, so dass 
Vorab-Optimierungen des Compilers aufgrund eines bestimmten Parameters 
ausgeschlossen sind. Aber das ist glaube ich gar nicht notwendig und die 
Funktion liefert dieselbe Laufzeit, wenn man als Parameter eine bereits 
zum Zeitpunkt der Kompilierung feststehende Konstante übergibt.

Als Laufzeit für den oben geposteten Code ermittele ich:
Atmega328, 16 MHz, PI Benchmark: 3.940148 s
SAM3X, 84 MHz,     PI Benchmark: 0.446243 s

Da liegt ein Faktor von ca. 8,8 zwischen, bei einem Faktor von 5,25 beim 
Takt des Controllers bei einem "Benchmark mit vielen 
Gleitkommadivisionen".

Wenn man nur die Gleitkommadivisionen für sich betrachtet, ohne das 
Benchmark-Brimborium in der Schleife, dürfte der Faktor etwas höher 
liegen. Ich habe hier allerdings keine Möglichkeit, nur ein Timing für 
eine einzelne Division alleine zu machen. Dafür würde man wohl ein 
Oszilloskop benötigen, was ich als Hobbybastler aber nicht habe.

von (prx) A. K. (prx)


Lesenswert?

Jürgen S. schrieb:
> Haben nicht auch die 8-Bit AVR-Controller mindestens drei
> "Register-Pärchen", in Form des X-, Y- und Z-Registers, in denen zwei
> 8-Bit Register zusammengefaßt sind, und die zusammen 16-Bit Register
> bilden?

Sind für Adressierung da. Bringt bei Rechnung nichts.

> Ich bin kein Assembler-Programmierer, aber das Instruction-Set der AVR
> 8-Bitter ist doch 16-Bit?

Die Befehlsbreite ist an dieser Stelle völlig irrelevant.

von m.n. (Gast)


Lesenswert?

Ich habe hier nur einen F407, den ich testen kann.
Bei 168MHz braucht eine FDIV etwa:

mit FPU  0,12µs
ohne FPU 0,55µs
double   1,05µs

Als Erfahrungswert für einen ATmega mit 16MHz habe ich 20 bis 30µs in 
Erinnerung, lasse mich da aber gerne korrigieren.

von Pit S. (pitschu)


Angehängte Dateien:

Lesenswert?

Hat mir doch keine Ruhe gelassen, weil ich das auch immer schon mal 
wissen wollte. Hier der direkte Vergleich von Soft und Hard FPU auf 
einem STM32F407 bei 168 MHz. Relevanter Code ist im Anhang.

Compiler: arm-none-eabi-gcc.exe (GNU Tools for ARM Embedded Processors) 
4.8.3 20140228 (release) [ARM/embedded-4_8-branch revision 208322]

Compiler/Linker options für SOFT: -O3 -std=gnu99 -c -fmessage-length=0 
-mcpu=cortex-m4 -mthumb -mfloat-abi=soft -g3 -gdwarf-2

Compiler/Linker options für HARD: -O3 -std=gnu99 -c -fmessage-length=0 
-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -g3 -gdwarf-2

Überraschend ist, dass die normalen double sin/cos Versionen keinerlei 
Unterschied zeigen. Offenbar sind die double Versionen nicht FPU 
optimiert. Die float Varianten sinf/cosf sind da schon besser. Werde ich 
mir merken.

Start HARD FPU test.....
Div/Mult:                         0.032
Cosf/Sinf float version:          0.182
Cos/Sin std. double version:      0.789
FPU test: PI = 3.141597; time used:  1.873

Start SOFT FPU test.....
Div/Mult:                         0.263
Cosf/Sinf float version:          1.015
Cos/Sin std. double version:      0.792
FPU test: PI = 3.141597; time used: 14.955

Insgesamt also ein Faktor von ca. 6 - 10 von HARD ggü SOFT bei dem 
verwendeten Compiler und seinen Libs. Hätte mehr erwartet, aber offenbar 
sind die Integer Einheiten auch nicht schlecht.

pitschu

von chris_ (Gast)


Lesenswert?

ARM Prozessoren haben den Barrel-Shifter direkt hinter der Alu und 
können eine Alu-Operation+Shift in einem Zyklus ausführen. Das kommt den 
Fließkommaberechnungen ohne FPU wohl ziemlich entgegen.

von (prx) A. K. (prx)


Lesenswert?

chris_ schrieb:
> ARM Prozessoren haben den Barrel-Shifter direkt hinter der Alu

Davor, nicht dahinter.

von Markus D. (mowlwurf)


Lesenswert?

Bei µC-FPUs sollte man beachten, dass diese meistens nur 
single-precision (Datentyp float) können. Im Falle von 
double-Berechnungen kann es also gut sein, dass einem die FPU gar nichts 
bringt.

Peter Daniel schrieb:
> Wie muss man sich das ganze vorstellen bezüglich der Programmierung?
> Reicht es da, die FPU zu aktivieren und sämtliche Berechnungen werden
> dann damit ausgeführt, oder muss sowas speziell im Code erwähnt werden?

Zumindest bei den Cortex-FPUs ist es so, dass im Programm-Code die FPU 
aktiviert und zusätzlich dem Compiler mitgeteilt werden muss, dass er 
auch die entsprechende Befehle benutzen soll.
Zusätzliche Infos sind hier aufgelistet:
http://community.arm.com/docs/DOC-7544

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Beim fdiv-Test mit AVR-GCC (AVR Studio 4.19) habe ich zunächst einen 
Schreck bekommen. Die reine Division dauerte mit Standardeinstellung 
rund 115µs.
Nachdem dem Linker die libm.a 'verordnet' wurde, ging es deutlich 
schneller.

Beim ATmega162 mit 16MHz braucht eine FDIV etwa 32µs.

von Frank K. (fchk)


Lesenswert?

Peter Daniel schrieb:

> Mir ist aufgefallen, dass viele Hersteller mittlerweile einige CPU's mit
> FPU anbieten... ausser Microchip. Zumindest nicht auf der 32-Bit Serie.
> Generell habe ich das Gefühl, dass immer weniger Leute auf PIC's setzen.
> Hat das seine Gründe? Sind die Controller schlechter / weniger weit
> entwickelt als diejenigen der Konkurrenz?

Die Frage ist : wofür brauchst Du Gleitkomma?
Viele industrielle Anwendungen kommen ganz gut mit Festkomma zurecht, 
darunter Audiosignalverarbeitung, Bildverarbeitung, Brushless DC 
Motorsteuerungen. Die meisten digitalen Signalprozessoren haben keine 
Gleitkommaeinheit, sondern arbeiten mit Festkommazahlen. Festkomma-DSPs 
haben oft eine höhere Taktfrequenz als die entsprechenden 
Gleitkomma-Äquivalente, brauchen weniger Strom pro MHz und sind 
billiger.

Gleitkomma verwendet man nur da, wo es
(a) geschwindigkeitstechnisch nicht darauf ankommt
(b) für Prototypen und Einzelstücke (geringerer Entwicklungsaufwand)
(c) wenn man einen hohen Dynamikbereich abdecken muss, d.h. es sowohl 
mit sehr kleinen als auch mit sehr großen Zahlen zu tun hat.

Das Problem bei Festkomma ist, dass Du nur einen gewissen Zahlenbereich 
hast, d.h. Du kannst nur Zahlen von zB -1 bis +1 oder -8 bis +8 oder so 
darstellen. Das erfordert beim Berechnen das Einfügen von 
Normierungsfaktoren, damit Du (a) die volle Genauigkeit behältst und (b) 
den zulässigen Wertebereich nicht überschreitest. Wenn Du das 
berücksichtigst, kannst Du viel Hardware sparen und beispielsweise 
Berechnungen in FPGAs auslagern, wo sie parallel durchgeführt werden.

fchk

von Historiker (Gast)


Lesenswert?

Als ich damals meinem 286er mit FPU ausrüstete benachmarkte ich vorher 
die Gleitkommaleistung.

Vorher 47Whetstones
Nacher ca2000Whetstones

Damit waren waren Schallberechnungen möglich.

von chris_ (Gast)


Lesenswert?

chris_ schrieb:
> ARM Prozessoren haben den Barrel-Shifter direkt hinter der Alu
a.k. schrieb:
>Davor, nicht dahinter.

Du hast recht ;-)
http://letsembed.files.wordpress.com/2013/12/barrel-shifter-and-ai.jpg

von Peter Daniel (Gast)


Lesenswert?

Tolle Diskussion hier, sehr viel neues dazugelernt. Danke!

Frank K. schrieb:
> Die Frage ist : wofür brauchst Du Gleitkomma?

Wie bereits erwähnt für die Berechnung mehrer Kalmann Filter. Würde evt. 
auch ohne gehen, müsste das mal durchrechnen wie genau das noch 
kommenwürde mit Festkomma...

Aber ich habe mich nun dazu entschieden trotzdem mal einen uC mit FPU zu 
kaufen. Da ich sowiso gerne mal andere Controller kennenlernen will und 
mich die ARM Cortex Prozessoren sehr interessieren nutze ich die Chance 
direkt und habe mir jetzt einen ATSAM4 mit FPU gekauft. So arbeite ich 
einmal mit Cortex und habb dabei noch direkt eine FPU benutzen. Sehr 
gespannt wie das ganze wird, aber ich denke es wird schon ein 
Unterschied sein vom Umstieg von den kleinen 8-Bittern auf 32-Bit mit 
allem drum und dran. Bin gespannt!

Vielen dank an all die tollen Leute hier!!!

von chris_ (Gast)


Lesenswert?

Mittlerweile gibt es neuere Technologien als nur eine FPU um 
mathematische Berechnungen zu Beschleunigen.

Vorteilhaft wäre vielleicht ein STM32F4 Discovery

http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF252419?sc=internet/evalboard/product/252419.jsp

Ich habe gerade mal nachgesehen. Ein Cortex M4F hat eine DSP Einheit mit 
MAC. Ich nehme an, dass die MAC auch für Fließkomma geht. Dann sollte 
man ein 100Tap FIR mit Float in 1us rechnen können.

Das Board gibt es für unter 20€.

von chris_ (Gast)


Lesenswert?

Hier gibt es ein Dokument, das die DSP-Fähgkeiten des Discovery-Boards 
ein wenig beschreibt:
http://www.dspconcepts.com/sites/default/files/white-papers/STM32Journal_DSPC.pdf

Die MAC-Operation geht laut diesem PDF in einem Zyklus. Ob sie nur in 
Integer geht oder auch in Float konnte ich noch nicht heraus finden.

von Stefan (Gast)


Lesenswert?

Peter Daniel schrieb:
> Aber ich habe mich nun dazu entschieden trotzdem mal einen uC mit FPU zu
> kaufen. Da ich sowiso gerne mal andere Controller kennenlernen will und
> mich die ARM Cortex Prozessoren sehr interessieren nutze ich die Chance
> direkt und habe mir jetzt einen ATSAM4 mit FPU gekauft. So arbeite ich
> einmal mit Cortex und habb dabei noch direkt eine FPU benutzen. Sehr
> gespannt wie das ganze wird, aber ich denke es wird schon ein
> Unterschied sein vom Umstieg von den kleinen 8-Bittern auf 32-Bit mit
> allem drum und dran. Bin gespannt!
>
> Vielen dank an all die tollen Leute hier!!!

Das hier solltest Du Dir auf jeden Fall anschauen damit ersparst Du Dir 
viele "Erste Fehler", z.b. wie man die CMSIS Lib nutzt oder wie man dem 
Compiler überhaupt sagt dass er die FPU nutzen soll.

http://www.atmel.com/Images/Atmel-42144-SAM4E-FPU-and-CMSIS-DSP-Library_AP-Note_AT03157.pdf

Wenn es Dir auf Performance ankommt, rate ich Dir den IAR Compiler zu 
testen, der holt am meisten raus

von chris_ (Gast)


Lesenswert?

Wie schneidet den der ATSAM4 gegenüber dem STM32F4 bezüglich 
Rechenleistung ab?

von Stefan (Gast)


Lesenswert?

Das kannst so generell nicht aussagen, es kommt darauf an bei welcher 
Disziplin und bei welcher Frequenz. Du kannst Dir verifizierte 
Ergebnisse auf der offiziellen Benchmark Seite EEMBC.ORG ansehen, es 
kommt auch auf den Compiler drauf an.
Z.b. bei max. Frequenz von 123MHz erreicht der SAM4S beim IAR 6.5 etwa 
408Coremark Werte, bei 21MHz etwa 63 Coremark Werte.
ST hat den STM32F417 mit Greenhills ins Rennen geschickt, erreicht bei 
168MHz etwa 488Coremark Werte

Auf den MHZ gesehen, liegt der SAM4S klar vorne mit 3.38Coremark / MHz, 
der STM32F4 mit 2.81Coremark / MHz. Beeindruckend dass der SAM4S unter 
allen CortexM4 die höchste Effizienz erreicht

von chris_ (Gast)


Lesenswert?

Vielen Dank für den Vergleich.
Mich würden vor allen Dingen Anwendungen wie digitale Filter aus der 
Signalverarbeitung interessieren.
Ich habe mir gerade das Datenblatt für den SAM4SD32 angesehen ( ist 
einfach, es hat nur 1231 Seiten ).
http://www.atmel.com/Images/Atmel-11100-32-bit-Cortex-M4-Microcontroller_Datasheet.pdf
Auf Seite 93 sind die Floatingpoint-Funktionen aufgelistet.
Dort gibt es beispielsweise
1
VFMA.F32     {Sd,} Sn, Sm      Floating-point Fused Multiply Accumulate

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.