www.mikrocontroller.net

Forum: PC-Programmierung Gnuradio SSE FIR Filter


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Daniel R. (zerrome)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eine Frage bezüglich einer SSE FIR Filter Implementierung in 
C++ bzw. SSE Assembler.

Die Leute von Gnuradio haben da schon coole Sachen gemacht, die ich 
jetzt gerne weiterverwenden möchte. Leider verstehe ich den Code 
nicht...

Ich habe mal die 3 Dateien um die es sich dreht an gehangen.

Wie ruft man den Code in der "fcomplex_dotprod_sse64" bzw 
"fcomplex_dotprod_sse" auf?

Den C++ Schnipsel der da angegeben ist verstehe ich soweit:
  fcomplex_dotprod_generic (const float *input,
                         const float *taps, unsigned n_2_complex_blocks, float *result)
  {
    float sum0 = 0;
    float sum1 = 0;
    float sum2 = 0;
    float sum3 = 0;
  
    do {
  
      sum0 += input[0] * taps[0];
      sum1 += input[0] * taps[1];
      sum2 += input[1] * taps[2];
      sum3 += input[1] * taps[3];
  
      input += 2;
      taps += 4;
  
    } while (--n_2_complex_blocks != 0);
  
  
    result[0] = sum0 + sum2;
    result[1] = sum1 + sum3;
  }

Das ist doch eine Faltung mit den komplexen Filterkoeffizienten taps.
Genau das brauche ich in meinem C Programm... Nur wie benutze ich den 
ASM Teil?!?

Bin für jede Anregung dankbar.

Viele Grüße

Daniel

Autor: Daniel R. (zerrome)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,
hat da keiner eine Ahnung? ich glaube das ist jetzt auch nicht so ein 
spezielles Gnuradio Problem sondern eher mein Verständnis vom Aufruf von 
dem Assembler Zeug...

.globl GLOB_SYMB(fcomplex_dotprod_sse)
  DEF_FUNC_HEAD(fcomplex_dotprod_sse)
GLOB_SYMB(fcomplex_dotprod_sse):
  pushl  %ebp
  movl  %esp, %ebp
  movl  8(%ebp), %eax    # input
  movl  12(%ebp), %edx    # taps
  movl  16(%ebp), %ecx


Ist das nicht soetwas wie eine Definition eines Funktionskopfes?
Wie würde man das aus einem C Programm aufrufen?

Autor: Bartli (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Schau mal in den C Headerfiles die im gleichen Verzeichnis wie 
fcomplex_dotprod_sse64.S liegen. Dort sind die Funktionsprototypen drin 
(probier z.B. mal fcomplex_dotprod_x86.h).

Autor: Daniel R. (zerrome)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo, ja hab ich mir angeschaut.

Komme aber irgendwie immer noch nicht weiter.
Wenn ich ein ganz simples eclipse c++ Projekt anlege bekomme ich 
seltsame Assembler Fehlermeldungen.
Ich habe das eclipse Projekt mal angehangen. Und hier die Konsolen 
Ausgabe:

**** Build of configuration Debug for project filt_test ****

make all 
Building file: ../src/ccomplex_dotprod_sse64.S
GNU assembler version 2.22 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.22
Invoking: GCC Assembler
as -v -o "src/ccomplex_dotprod_sse64.o" "../src/ccomplex_dotprod_sse64.S"
../src/ccomplex_dotprod_sse64.S: Assembler messages:
../src/ccomplex_dotprod_sse64.S:62: Error: junk at end of line, first unrecognized character is `('
../src/ccomplex_dotprod_sse64.S:63: Error: invalid character '(' in mnemonic
../src/ccomplex_dotprod_sse64.S:64: Error: invalid character '(' in mnemonic
../src/ccomplex_dotprod_sse64.S:190: Error: invalid character '(' in mnemonic
make: *** [src/ccomplex_dotprod_sse64.o] Fehler 1

**** Build Finished ****


Da geht scheinbar was mit diesem Teil aus der *.S schief...

.globl GLOB_SYMB(ccomplex_dotprod_sse)
  DEF_FUNC_HEAD(ccomplex_dotprod_sse)
GLOB_SYMB(ccomplex_dotprod_sse):

Das sollte aber nicht sein, weil in der "assembly.h" so wie ich das 
verstehe das ja irgendwie definiert wird...

Bin bei vielen Sachen da am raten, weil ich mit ASM nicht auskenne.

Hinweise jeglicher Art sind willkommen :)

Autor: Bartli (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Naja, Endung .S (gegenüber .s) bedeutet bei gcc üblicherweise, dass der 
Assemblercode vor dem Assemblieren von cpp (dem C Präprozessor) 
bearbeitet werden muss.

Das kannst du auf verschiedene Arten erreichen, z.B. indem du die 
Assemblersourcen nicht direkt as an den Kopf wirfst, sondern über gcc 
assemblierst.

Du musst halt in den gnuradio Makefiles schauen wie die das machen.

Autor: Bartli (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
OK, probier mal sowas:

gcc -c ccomplex_dotprod_sse64.S

Autor: Daniel R. (zerrome)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hey, joa cool.
Jetzt krieg ich ein *.o aus dem Assembler Zeug.
Bekomme es aber nicht dazu gelinkt, bzw. den C Kram so nicht kompiliert.
Muss immer noch was falsch sein. Aber keinen Plan was.

Danke aber schonmal für die Hilfe Bartli. Kann eigentlich nicht mehr 
viel fehlen...

Viele Grüße

Daniel

Autor: Daniel R. (zerrome)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
So, nur um das hier abzuschließen...

Hab jetzt die Faltung selber mit SSE Intrinsics geschrieben.
Bin damit bei einem Programm von ~70% auf ~10% CPU Zeit gekommen :)

Lohnt sich also.

Viele Grüße

Daniel

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net