floating operation mit TMS320C6000

Gast #939405
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?
Gast #939431
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?
Gast #942118
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?
Admin Persönliche Seite #942796
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];
#942851
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.
Gast #943226
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?
Gast #944397
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
Gast #944938
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?
Gast #945647
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren