Hallo! habe eine TMS320C6414 Board von ti, bin gerade dabei meine eigene Such-Algorithmen durch Code Composer Studio zu testen. naja! das Problem ist, meine Formel, mit der ich die Algorithmen realisieren möchte, basiert auf floating Operation. aber der Board C6414 unterstützen nur Festkomma operation, habe aber trozdem versucht, was erstaunlich ist, ich habe keine Fehlermeldung bekommen!! aber die Zeit ist aber unglaublich so lange, ca. 20 fach langsamer als normal PCs . was ich jetzt vor habe ist, die Floating Operation zu vermeiden. meine Formel sieht so aus: Ergebnis= a / sqrt(b*c); a,b und c sind alle ganz Zahl! wie kann ich das floating Problem umgehen? hat jemand eine Vorschlag?
Kein Wunder dass es geht. Floating point macht dein c compiler. Aber auf kosten der Rechenzeit. TI hat ne super Libary für Festkomma. nennt sich IQMath. Sollte dir soweit helfen.
also! heißt das, dass die Floating Operation gar nicht von C6414 gerechnet, sonder von die c Complier. und noch eine Sache: habe ich gerade gegoolte, ist die IQMath nicht nur für TMS320C28x Reih. ich habe eine C6414, ist diese Bibilothek auch gültig dafür?
hallo! Danke für die Hinweis. ich habe meine Code so geändert, dass ich nur mit einfache Operation auch klar kommen kann. meine Code sieht etwa so aus: for (i=0; i<500; i++){ for (j=0; j<500; j++){ for (x=0; x<500; x++){ for (y=0; y<500; y++){ ergebnis=arrray_1[i][j]-array_2[x][y]; } } } } ohne floating Operation! aber trotzdem ist die Laufzeit 10 fach als normal PCs, wo liegt das Problem? die C6414 sollte doch viele schnell als die normal PCs, oder?
Der DSP hat nur ein paar 100 MHz, viel schneller als ein PC kannst du damit nicht werden, wenn ueberhaupt. Auf jeden Fall musst du alle Ausfuehrungseinheiten und Busse voll ausnutzen und dafuer sorgen dass deine Arrays im internen Speicher liegen. Das schafft der Compiler bei deinem Code sicher nicht von alleine. Schneller geht es manuell in Assembler oder wenn du Library-Funktionen fuer deine Aufgabe findest. Uebrigens sehe ich gerade dass der Code oben so sowieso keinen Sinn macht, das selbe geht auch ohne eine Schleife: ergebnis=arrray_1[499][499]-array_2[499][499];
Versuche deine Funktionen ohne Sprünge und Schleifen aufzubauen - die bremsen extremst. Falls das nicht möglich ist, implementiere sie evtl. in Assembler, da gibt es entsprechende RPT-Befehle. Obige Aussagen beziehen sich zwar auf die C2000-Serie, ich denke aber dass das bei den C6000 nicht viel anders sein wird.
sorry! habe ich den Code nicht so richtig fertig gekriegt, und jetzt ist das richtig: for(ih=0 ; ih<(480-26); ih++ ) { for(iw=0; iw<(640-21); iw++) { for (j=0;j<26;j++) { for(i=0; i<21 ; i++) { sum=sum+abs(imag[iw+i][ih+j]-tMuster[i][j]); } } if( sum<sum_min ) {sum_min=sum; *xpos=iw; *ypos=ih; } sum=0; } } ja! mit diesem Code möchte ich eigentlich ein Muster-suchen (Muster ist 21*26)bei eine 640*480 Bild machen. die Code habe ich bei Laptop 2 sek. gebraucht, aber bei C6414 habe ich unglaublich 14 Sek. gebraucht!! möchte ich eigentlich statt Array mit point arbeiten, aber die Point-Operation ist auch sehr gefährlich. z.B. wenn ich die Adress von die erste Pixel zu char * pixel_1 übergeben, dann mache ich so: pixel_640=pixel_1+640; liegt dann wirklich in pixel_640 die Adress von 640st. Pixel?? und dann habe ich gemessen, wie lange die 4-Fach For schleifen die Zeit braucht("sum=.." und "if()" wegkommentieren, for schleife leer laufen). dann stelle ich mich fest,dass das For schleife sogar 5 sek. braucht! aber ohne For schleife sehe ich schwarz für meine Anwendung. hat jemand eine Idee, wie ich machen soll?
Hab ich doch schon geschrieben: Speicherbereiche beachten, Library-Funktionen verwenden, Code so anpassen dass ihn der Compiler gut optimieren kann, notfalls selbst Assemblercode schreiben.
Die C64x sind schon recht leistungsfähige DSPs, allerdings wollen sie bzw. CCStudio mit Code gefüttert werden, mit dem der Code Generator vernünftig umgehen kann. Funktionsgleicher Code kann ohne weiteres Laufzeitunterschiede von 10x oder mehr erzeugen. Der C64x, wie alle C6x, haben keinen Hardware-Repeat (RPT, RPTB beim C5000). Mehr dazu hier: http://focus.ti.com/lit/ug/spru732g/spru732g.pdf. Eigentlich sind die C6x ja RISC-Prozessoren, denen komplexe Befehle fehlen. Conditional Branches werden durch arithmetische Operationen gesteuert. In vielen Fällen helfen sog. Intrinsics (optimierter Code in Form von speziellen non-Ansi-C-Funktionen). Übrigens hat jeder Branch-Befehl 5 Leerzyklen zur Folge, wenn dem Compiler nichts besseres "einfällt". Das hängt mit der tiefen Pipeline zusammen, die erst "geflusht" werden muss. Wirklich helfen wird im vorliegenden Beispiel nur Assembler-Code. Gruß, Andreas www.dsp-bayer.de
Ich vergaß: Floating Point-Arithmetik wird auf dem C64x nur emuliert, wie seinerzeit beim 486SX. Nur die C67xx sind richtige Floating-Point-DSP. Gruß, Andreas www.dsp-bayer.de
Hallo! Danke für die hilfreiche Antwort, mir ist jetzt klar, wenn ich die Code schnell machen möchte,muss ich dann die in Assembler-Code schreiben, aber was ich immmer noch nicht verstanden habe, warum die DSP für die selbe Code mehr Zeit braucht als die normale PCs? denn ich habe vorher schon mal gelesen, dass die C6414 ist spezielle für bildverarbeitung gedacht, und sollte sehr sehr schnell sein. warum in meine Fall ist das genau umgekehrt?
DSPs sind schnell, aber dumm. Du musst ihnen alles perfekt vorkauen, Daten in die richtigen Speicherbereiche legen, Code so strukturieren dass alle Ressourcen (MACs, ALUs, Busse) gleichzeitig voll ausgenutzt werden. Wenn du das nicht machst darfst du nicht erwarten irgendwo in die Nähe der Performance eines PC-Prozessors zu kommen.
Einer der Gründe: > Übrigens hat jeder Branch-Befehl 5 Leerzyklen zur Folge, wenn dem Compiler > nichts besseres "einfällt". Das hängt mit der tiefen Pipeline zusammen, die > erst "geflusht" werden muss.
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.