Ich arbeite mit einem Tricore 1796 von Infineon. Als Kompiler benutze ich die Toolchain von Hightec. Die Datentypen meines Quellcodes sind in float32 deklariert. Die Wortbreite jedes einzelnen Rechenschrittes beträgt also 4 Byte beziehungsweiße 10 gültige Stellen in dezimal umgerechnet. Die einzelnen Werte haben teilweise sehr kleine Werte. Mein berechnetes Ergebnis wird erst bei der sechsten Berechneten Dezimalstelle ungenau. Mir würde ein Ergebnis im Genauigkeitsbereich der dritten Stelle ausreichen. Um Rechenzeit einzusparen wäre es schön wenn ich mit einem Datentypen float16 rechnen könnte. Jetzt meine Frage: Gib es Optionen die ich im makefile einstellen kann, die es mir ermöglichen mit solch einem Datentyp zu rechnen? Ich habe im Handbuch tricore-gcc leider nichts dazu gefunden. Wenn ich wichtige Dinge zum Verständnis der Frage vergessen habe einfach nocheinmal nachfragen.
@ Martin Vogel (lachned) >Die Datentypen meines Quellcodes sind in float32 deklariert. >Die Wortbreite jedes einzelnen Rechenschrittes beträgt also 4 Byte >beziehungsweiße 10 gültige Stellen in dezimal umgerechnet. ??? Das sind bestenfalls 5..6. Die Matritze ist nur 23 Bit breit. >Die einzelnen Werte haben teilweise sehr kleine Werte. >Mein berechnetes Ergebnis wird erst bei der sechsten Berechneten >Dezimalstelle ungenau. Deckt sich mit der Theorie ;-) >Mir würde ein Ergebnis im Genauigkeitsbereich der dritten Stelle >ausreichen. >Um Rechenzeit einzusparen wäre es schön wenn ich mit einem Datentypen >float16 rechnen könnte. Gibt es AFIAK nicht. Nimm Festkommaarithmetik. MfG Falk
>Um Rechenzeit einzusparen wäre es schön wenn ich mit einem Datentypen >float16 rechnen könnte. Wieviel Nanosekunden willst Du denn einsparen? Ich würde es bei 'float' belassen.
Es handelt sich um einen recht komplexen nichtlinearen modellprädiktiven Regler. Ein Zyklus braucht 80ms....mit float 32 Mit double waren es noch 150ms Wie gesagt, meine Werte sind recht klein. Ich denke mit umskalieren auf Festkomma habe ich keine Chance noch vernünftige Werte zu bekommen. Was ist AFIAK??
@ Martin Vogel (lachned)
>Was ist AFIAK??
As Far As I know, Soweit ich weiss
MfG, Mit freundlichen Grüssen
Falk ;-)
Von der Hardware wird lediglich float (32 Bit) unterstützt, 16-Bit floats werden weder vom Compiler (tricore-gcc) noch von der TriCore-Hardware unterstützt. > Ein Zyklus braucht 80ms....mit float 32 > Mit double waren es noch 150ms Zunächst wundert mich dieses Verhältnis (Faktor 2), ich würde da wesentlich mehr erwarten, denn double muss per Software emuliert werden, während es für floats die .f-Instruktionen gibt. Die Option -mhard-float wird standardmässig aktiviert für TC1796, so dass 1) diese Option deaktiviert wurde 2) der Algorithmus verbrauch die Zeit nicht mit der Arithmetik, sondern woanders Zudem ist es ein weit verbreiteter Irrglaube, 16-Bit-Arithmetik sei schneller als 32-Bit-Arithmetik, wenn man sich auf einer 32-Bit-Architektur befindet. Eine 16-Bit-Addition (int) auf TriCore geschieht z.B., indem die Werte auf 32 Bit expandiert werden, die Operation ausgeführt und das Ergebnis wieder abgeschnitten wird. Ursache dafür ist, daß TriCore als 32-Bit-Architektur 16- und 8-Bit Arithmetik kaum unterstützt. Um genaue Aussagen über Optimierungspotential zu machen, müsste man in die Quellen und ins Compilat sehen können. Und natürlich muss man bei Bibliotheks-Funktionen die float-Version verwenden, also z.B. sqrtf für die Quadratwurzel anstatt sqrt. Sonst wird intern nämlich mit double gerechent.
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.