Forum: PC-Programmierung Gnuradio SSE FIR Filter


von Daniel R. (zerrome)


Angehängte Dateien:

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

von Daniel R. (zerrome)


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?

von Bartli (Gast)


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).

von Daniel R. (zerrome)


Angehängte Dateien:

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 :)

von Bartli (Gast)


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.

von Bartli (Gast)


Lesenswert?

OK, probier mal sowas:

gcc -c ccomplex_dotprod_sse64.S

von Daniel R. (zerrome)


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

von Daniel R. (zerrome)


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

von Daniel R. (zerrome)


Angehängte Dateien:

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

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.