Gast
#1495772
Hi, ich würde gern ein paar Matlab Simulationen aus gewchwindigkeitsgründen durch C ersetzen. Kennt da jemand ein paar gute Bibliotheken zur Signalverarbeitung/Mathematik?
|
Anzeige
|
C Bibliotheken zur Signalverarbeitung\Mathematik (Simulation)
Gast
#1495772
Hi, ich würde gern ein paar Matlab Simulationen aus gewchwindigkeitsgründen durch C ersetzen. Kennt da jemand ein paar gute Bibliotheken zur Signalverarbeitung/Mathematik? Wenn Du sehr schnelles Wurzelziehen und Sinus etc. willst, nimm die Funktionen von id Software. Ja, genau die die Doom und Quake programmiert haben. Den Sourcecode gibt es im Internet. Für mehr Genauigkeit halt die C Standard Library. Für z.B. FIR-Filter habe ich auch schon diverse Open Source Implementierungen gesehen, aber ich weiß nicht ob es da sowas wie eine "Standardbibliothek" gibt? Gibt's da nicht auch den Matlab-To-C Compiler? Damit könnte man doch direkt schnellen C-Code erzeugen. Dann ein guter Compiler (icc z.B. für Windows), und dann sollte das performant genug sein. Handoptimierte C-Routinen... naja. Das geht immer auf Kosten der Genauigkeit, man kriegt neue Fehler rein etc. pp. Falls es noch zu langsam ist, würde ich empfehlen den Algorithmus zu optimieren, ggflls. Parallelisieren etc. Ras Funk schrieb:
> Gibt's da nicht auch den Matlab-To-C Compiler?
Vielleicht hat er den nicht, weil der womöglich wie so ziemlich jede
"Box" bei Matlab extra kostet...
Erst mal muss man herausfinden, was es ist das zu langsam ist. Dazu hat Matlab einen Profiler. Vorher sind jegliche Diskussionen über Optimierungen sinnlos.
Gast
#1496371
Man sollte auch, wenn man meint, dass bestimmte Routinen zu langsam sind, in Betracht ziehen, dass Matlab einen JIT-Compiler hat und vieles damit zur Laufzeit kompiliert werden. Routinen wie ein Sinus usw. sind mit Sicherheit schon kompiliert bzw. extra optimiert. Vielleicht wurde einfach etwas "ungeschickt" programmiert?
Gast
#1496392
Wurzelziehen, Sinus, FIR ... All das gehört quasi zur "Kernkompetenz" von Matlab und ist daher schon hoch optimiert. Unter der Voraussetzung, dass auch entsprechend "vektorisiert" gerechnet wird und die Genauigkeit von double benötigt wird, wirst Du es in C kaum schneller hinbekommen.
Gast
#1496406
Das Vektorisieren ist übrigens überhaupt nicht mehr notwendig, wenn ein paar Regeln für den JIT-Compiler erfüllt werden. Dann kann dieser die Funktion kompilieren und es ist kaum noch ein Unterschied zur "vektorisierten" Version festzustellen.
Gast
#1496413
Zuerst profilen. Tabu sind jegliche handgeschriebene Schleifen ala for i=1:1000000 ... Wenn man nur mit eingebauten Funktionen arbeitet, die wiederum mit grossen Vektoren füttert, dann wird man es wohl kaum performanter bekommen. Teste mal deinen Code auch mit Octave. BTW: ich habe neulich sehr kurz über Blitz++ gelesen. Das ist eine Bibliothek für C++, die stark auf templates aufbaut. Sie soll d = a + b + c statt üblichen (a.operator+(b)).operator+(c), dass genau 2 mal durch for(i=0;i<a.size;i++) läuft, einmalig mit for(i=0;i<a.size;i++) c[i]=a[i]+b[i]+c[i]; ausführen. Was natürlich deutlich schneller ist. Welche tolle Transformationen noch zur Compilezeit angestellt werden, weiss noch nicht. Grüsse, daniel >>Kennt da jemand ein paar gute Bibliotheken zur Signalverarbeitung/Mathematik?
it++
itpp.sourceforge.net
Cheers
Detlef
Gast
#1496777
>Handoptimierungen
Es empfiehlt sich, die Libs mal druchzuvalidieren. Ich habe das mal mit
Excel und Matlab gemacht. Gerade beim Sinus tun sich da Abgründe auf.
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|