Forum: Digitale Signalverarbeitung / DSP / Machine Learning floating operation mit TMS320C6000


von Yang (Gast)


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?

von 123 (Gast)


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.

von Yang (Gast)


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?

von Michael K. (Gast)


Lesenswert?


von Yang (Gast)


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?

von Andreas S. (andreas) (Admin) Benutzerseite


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];

von M. K. (kichi)


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.

von Yang (Gast)


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?

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von DSP Andreas (Gast)


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

von DSP Andreas (Gast)


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

von yang (Gast)


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?

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Micha (Gast)


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.

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
Noch kein Account? Hier anmelden.