Gnuradio SSE FIR Filter

OP #2646171
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:
1
  fcomplex_dotprod_generic (const float *input,
2
                         const float *taps, unsigned n_2_complex_blocks, float *result)
3
  {
4
    float sum0 = 0;
5
    float sum1 = 0;
6
    float sum2 = 0;
7
    float sum3 = 0;
8
  
9
    do {
10
  
11
      sum0 += input[0] * taps[0];
12
      sum1 += input[0] * taps[1];
13
      sum2 += input[1] * taps[2];
14
      sum3 += input[1] * taps[3];
15
  
16
      input += 2;
17
      taps += 4;
18
  
19
    } while (--n_2_complex_blocks != 0);
20
  
21
  
22
    result[0] = sum0 + sum2;
23
    result[1] = sum1 + sum3;
24
  }

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
Angehängte Dateien:
OP #2655362
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...
1
.globl GLOB_SYMB(fcomplex_dotprod_sse)
2
  DEF_FUNC_HEAD(fcomplex_dotprod_sse)
3
GLOB_SYMB(fcomplex_dotprod_sse):
4
  pushl  %ebp
5
  movl  %esp, %ebp
6
  movl  8(%ebp), %eax    # input
7
  movl  12(%ebp), %edx    # taps
8
  movl  16(%ebp), %ecx

Ist das nicht soetwas wie eine Definition eines Funktionskopfes?
Wie würde man das aus einem C Programm aufrufen?
OP #2665228
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:
1
**** Build of configuration Debug for project filt_test ****
2

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

15
**** Build Finished ****

Da geht scheinbar was mit diesem Teil aus der *.S schief...
1
.globl GLOB_SYMB(ccomplex_dotprod_sse)
2
  DEF_FUNC_HEAD(ccomplex_dotprod_sse)
3
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 :)
Angehängte Dateien:
Gast #2666331
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.
OP #2667084
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
OP #3675546
Lesenswert?
• ▲
▼
Hallo zusammen,
hier auf Anfrage hin ein Eclipse Beispielprojekt (im Anhang) mit SSE 
Faltung / Filterung. Wer Eclipse nicht benutzen mag, muss in das 
Verzeichnis
1
/Debug
 gehen und
1
make clean;make
 ausführen. Dann sollte es eine ausführbare Datei mit dem Namen
1
FIR_SSE
 geben.

Viele Grüße
Daniel
Angehängte Dateien:

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