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.