mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP floating operation mit TMS320C6000


Autor: Yang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Yang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Michael K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Yang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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];

Autor: Michael K. (kichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Yang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich doch schon geschrieben: Speicherbereiche beachten, 
Library-Funktionen verwenden, Code so anpassen dass ihn der Compiler gut 
optimieren kann, notfalls selbst Assemblercode schreiben.

Autor: DSP Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: DSP Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: yang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.