Datum:
Angehängte Dateien: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
Datum:
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?
Datum:
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).
Datum:
Angehängte Dateien: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 :)
Datum:
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.
Datum:
OK, probier mal sowas: gcc -c ccomplex_dotprod_sse64.S
Datum:
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
Datum:
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