Forum: Digitale Signalverarbeitung / DSP / Machine Learning Alignment- und Performance-Problem beim Blackfin


von Joern (Gast)


Lesenswert?

Moin,

gerade bastel ich an einem Cornerdetector auf dem Blackfin und bin dabei 
zwei Problemen begegnet, denen ich bisher noch nicht beikommen konnte.

Fuer die Detektion verwende ich die von AD optimierte 2D-Faltung, 
kompiliert mit den GNU-Compiler. Diese verlangt nach 4 Byte aligned 
Daten und bislang ist es mir noch nicht gelungen, Arrays von short-Typen 
4 Byte zu alignen. Im Moment mache ich es ueber den Umweg von 
int-Arrays, es muss aber doch auch eine schoenere Moeglichkeit beim 
GNU-Compiler in C geben oder?

Das weitere Problem ist ein signifikanter Unterschied zwischen 
rechnerischer und tatsaechlier Performance. Rechnerisch muessten um die 
1000 Faltungen eines kompletten Bildes pro Sekunde moeglich sein. 
Praktisch komme ich aber auf etwas was mindestens um den Faktor 50 
darunter liegt. Ist das allein mit unguenstig im Speicher verteilten 
Arrays zu erklaeren oder deutet es auf etwas grundlegend falsch 
gemachtes, wie falsch initalisiertem PLL und SDRAM oder Cache hin? Und 
wenn es nur der Speicher ist, wie gelingt es mir in C mit dem GNU, die 
Felder elegant in unterschiedlichen Mikrobanks unterzubringen? Es ist 
doch hoffentlich nicht so, dass ich das aufwendig im Linkskript loesen 
muss, oder?

Danke und Gruss, Joern

von (prx) A. K. (prx)


Lesenswert?

Schon mal __attribute__((aligned(4))) probiert?

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Machst du das auf uCLinux oder Bare Metal? Wenn Bare Metal: Da wird wohl 
ein "kleiner" Eingriff ins Linkerscript nötig sein.

  Beitrag "Re: Blackfin GCC - Standalone!"

von Joern (Gast)


Lesenswert?

ja, dies _attribute_ ging garnicht, da hat der Compiler immer einen 
Fehler ausgegeben. Was habe denn da falsch gemacht, denn das untere 
Beispiel scheint den selben Compiler zu verwenden? Ist eine 
stand-alone-application.

Gruss, Joern

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Joern schrieb:
> ja, dies _attribute_ ging garnicht, da hat der Compiler immer einen
> Fehler ausgegeben. Was habe denn da falsch gemacht, denn das untere
> Beispiel scheint den selben Compiler zu verwenden? Ist eine
> stand-alone-application.
>
> Gruss, Joern

Welches "untere Beispiel" meinst du? Was für einen Fehler schmeißt die 
GCC? Am besten du zeigst uns mal Code.

von WuschelWerner (Gast)


Lesenswert?

> rechnerischer und tatsaechlier Performance

Was hast du den gerechnet ? Die tatsächliche Performance ist oft um 
einiges geringer als die Angaben im Datenblatt, die sich auf praktisch 
mögliche, aber oft nur theoretische Fälle beziehen. Da reicht ein 
zyklischer Interrupt der dir die Perfomance drückt usw.

von Joern (Gast)


Lesenswert?

Ok, ich habe es nochmal probiert und es scheint weitestgehend zu laufen 
(zumindest das alignen).
Wie bekomme ich aber die Verteilung auf unterschiedliche Banks im SDRAM 
hin? Ich hoffte, man koennte beliebige Attribute verwenden und diese 
dann im Linkerskript definieren. Der Compiler sieht das anders:
1
harris.c:20: warning: 'BANK3' attribute directive ignored
2
harris.c:22: warning: 'BANK4' attribute directive ignored
3
harris.c:24: warning: 'BANK2' attribute directive ignored
4
harris.c:25: warning: 'BANK3' attribute directive ignored
5
harris.c:26: warning: 'BANK1' attribute directive ignored

Wie kann ich das Problem also loesen?

Vielen Dank schonmal, Joern

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.