Floating point Geschwindigkeit

Gast #7105451
Lesenswert?

Ich habe festgestellt, dass floating point Berechnungen für Division und 
Addition recht langsam sind. Uint64 ist ebenfalls echt lahm. Es geht 
darum, dass ich Register für eine PLL im avr berechne für gegebene 
Frequenz. Kann man floating point Operationen und uint64 Operationen 
irgendwie mit dem avr GCC beschleunigen?
Gast #7105473
Lesenswert?

Die Arbeitswerte einer PLL werden üblicherweise berechnet, um damit eine 
gewünschte Frequenz aus einer gegebenen Referenzfrequenz abzuleiten.
Bis sich die gewünschte Frequenz einstellt, vergehen schon mal einige 
ms.
Oder deutlich mehr, wenn es tiefere Frequenzen sind.

Welche Anwendung könnte Probleme bekommen, wenn die Berechnung nicht 
viel schneller, als die Einschwingzeit einer PLL ist?

Wann kann man denn die Wunschfrequenz überhaupt nutzen?
Gast #7105489
Lesenswert?

Nils E. schrieb:
> Kann man floating point Operationen und uint64 Operationen irgendwie mit
> dem avr GCC beschleunigen?

Was hast du von einem 8 bit uC ohne floating point hardware erwartet ? 
So ein Ding schafft halt nur so 1000 -10000 floating point operationen 
pro Sekunde.

Bei uint64 sollte zumindest addition und subtraktion schneller sein.

Der normale Weg ist, dass man seine Software und die verwendeten 
Algorithmen an den Prozessor anpasst. Fixed point in 32 bit wäre oft 
eine Lösung.

Tabellen mit linearer interpolation  sind eine weitere.
Gast #7105515
Lesenswert?

MaWin schrieb:
> Nils E. schrieb:
>> Kann man floating point Operationen und uint64 Operationen irgendwie mit
>> dem avr GCC beschleunigen?
>
> Was hast du von einem 8 bit uC ohne floating point hardware erwartet ?

Endlich mal etwas was früher nicht besser war: da gab es auf 8-bitter 
hauptsächlich BASICs mit ausschliesslich Ganzzahlarithmetik, obendrein 
nur zu einstelligem MHz Takt.

Da macht son Microchip ATMega doch eine ganz jute Fijur her.
#7105541
Lesenswert?

Ich verstehe die Problematik nicht. Ich habe schon zig PLLs und DDS mit 
dem AVR angesteuert. Ganzzahlig und fraktional. Nie bin ich auf dieses 
Problem gestoßen.

Das macht float-Divisionen zwar nicht schneller, zeigt mir aber, dass Du 
möglicherweise das Problem falsch angehst. Da Du die Rechenoperationen 
nicht viel schneller bekommen wirst, wäre der Ansatz nun also, den 
bisherigen Ansatz zu überdenken. Und warum muss es schnell sein?

Um welche PLL geht es denn? Und was ist Dein Ziel und wie willst Du es 
im Moment lösen?


Gruß
Jobst
Gast #7105590
Lesenswert?

Jobst M. schrieb:
> Um welche PLL geht es denn? Und was ist Dein Ziel und wie willst Du es
> im Moment lösen?

Ich habe mir einen Kabeltester gebaut, der auf einen Sweep von mehreren 
Frequenzen angewiesen ist und da will ich die Einstellzeit für einen 
neuen Punkt eben möglichst klein halten. Die PLL braucht laut Datenblatt 
nicht mehrere Millisekunden, sondern eher 300µs im Fast-Lock Modus.
#7105617
Lesenswert?

Wenn es spezifisch um sweeps mit konstantem Frequenzraster geht, lässt 
sich mit den "exact frequency modes", welche viele PLL ICs 
bereitstellen, ebenfalls viel Rechenaufwand sparen.
Vieles kann dann im Voraus berechnet werden.
Ausserdem würde ich eher mit Uint64/32 und in Hz rechnen ststt Floats zu 
verwenden
Gast #7105640
Lesenswert?

> Uint64 ist ebenfalls echt lahm.
Das habe auch ich schon festgestellt. Beispiel:
Bei einer 32x32->64 MUL werden die Operatoren zuerst auf 64 Bit 
erweitert und dann multipliziert, mit der Folge, dass statt der 
notwendigen 16 Multiplikationen 64 ausgeführt werden, davon 48 mit 0, 
die man sich (samt den unzähligen ADDs und ADCs danach) sparen könnte.
Zumindest war das vor einigen Jahren so, als ich mir das anschaute.
Da gibt es noch deutliches Optimierungspotential, d.h. es müsste mal 
Hand angelegt werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren