Benötige Hilfe bei Optimierung
-
Du bekommst die Laufzeiten nach Funktionen gelistet. Wenn du also deine Megafunktion in kleinere Funktionen aufteilst, kannst du sehen, wo die meiste Zeit draufgeht. Nach der Verbesserung kannst du wieder alles zusammen in ein Monstrum stecken, wenn du das willst.
-
Hi,
Wenn du valgrind --tool=callgrind ./matching ausführst und das Ganze mit Debugsymbolen kompiliert hast, dann zeigt dir kcachegrind auch wieviel Zeit jede Zeile des Quellcodes benötigt hat.
KaPtainCugel
-
Und wenn du es einfach mal auf einer GPU implementierst? f'`8k
Gruß, TGGC (der kostenlose DMC Download)
-
Irgendwie bin ich etwas verwirrt von deiner ausgabe. Hast du nur die Hauptdatei mit der Profiling-Option compiliert? Denn selbst wenn du alles in einer Funktion hast, deine Funktion wird ja wohl irgendetwas tun. Normalerweise wird das Ergebnis aufgesplittet bis in die allerkleinste Einheit, so dass man sogar sehen kann wie viel Zeit man mit dem Zugriff auf Feldindizes* verbracht hat.
edit: Oh, ich sehe gerade du hast dein Programm schon gepostet. Deine Hauptfunktion ruft ja tatsächlich keine Unterfunktionen auf. Oje. Dann kann ich mich nur dem Rat anschließen, das Programm etwas prozeduraler zu gestalten. Meistens ist das auch allgemein eine sehr gute Idee, weil man dabei schon viele mögliche Verbesserungen sieht.
*: Natürlich nur in C++, wo der Zugriff auf Felder als Funktionsaufruf abstrahiert ist.
-
KPC schrieb:
Wenn du valgrind --tool=callgrind ./matching ausführst und das Ganze mit Debugsymbolen kompiliert hast, dann zeigt dir kcachegrind auch wieviel Zeit jede Zeile des Quellcodes benötigt hat.
Danke für den Tipp, das Ergebnis sieht (nach 2.3h
) in etwa so aus:
2.26% sqrt (228.219.779 Aufrufe) 0.78% isnan (228.219.779 Aufrufe) 0.09% 0x00003517 (228.219.782 Aufrufe) 0.01% cvLoadImage (2 Aufrufe) 0.00% 0x00016a0f (260.022 Aufrufe) ....
mal sehen, vielleicht kann ich statt sqrt eine Aproximation verwenden.
TGGC schrieb:
Und wenn du es einfach mal auf einer GPU implementierst?
"Einfach mal" spielt es bei mir leider nicht (keine Erfahrung damit und meine Grafikkarte unterstützt noch kein CUDA), außerdem soll das Ganze ohnehin auf einem FPGA realisiert werden.
Damit weiß ich aber immer noch nicht was der Compiler optimiert, sodass die Rechenzeit halbiert wird.
LG
EDIT:
jetzt habe ich die Source-Code Ansicht gefunden und da werden die beiden Zeilen mit jeweils 17.81% bewertet:l_e = abs(left[l_pos]-right[l_pos1])+abs(left[l_pos+1]-right[l_pos1+1])+abs(left[l_pos+2]-right[l_pos1+2]); r_e = abs(left[r_pos1]-right[r_pos])+abs(left[r_pos1+1]-right[r_pos+1])+abs(left[r_pos1+2]-right[r_pos+2]);
Ich nehme an das es an der abs() Funktion liegt, aber das sollte doch besser gehen. ich werd mal statt der Summe der absoluten Differenzen (SAD) die kleinsten Quadrate probieren (SSD).
EDIT 2:
Ach ja, gibt es eine Funktion die sowohl Rest als auch das Ergebnis der Division liefert??
-
XBert schrieb:
Ach ja, gibt es eine Funktion die sowohl Rest als auch das Ergebnis der Division liefert??
Nach DIV steht der Rest AFAIK in AH.
-
... viel hübscher und platformunabhängiger ist aber div.
-
Wenn du nur wissen willst, was der Compiler optimiert, warum schaust du dir nicht einfach den Compileroutput an? f'`8k
Gruß, TGGC (der kostenlose DMC Download)
-
TGGC schrieb:
Wenn du nur wissen willst, was der Compiler optimiert, warum schaust du dir nicht einfach den Compileroutput an?
Gerne, wenn du mir sagst wie ich das mache. Mit -E bekomme ich nur das Ergebnis nach dem Preprozessor, und mit Assemblercode kann ich leider nicht viel anfangen.
Aber alleine durch die Verwendung von div() anstatt der Division und modulo-Operation einzeln wurde die Ausführzeit von ~618s auf ~427s reduziert. Um die abs() funktion komme ich aber vermutlich nicht herum, denn wenn ich die Abstandsquadrate verwende ist die Qualität des Endergebnisses deutlich schlechter.
LG
-
XBert schrieb:
mit Assemblercode kann ich leider nicht viel anfangen.
Tja, dann wirst du die Optimierungen wohl "leider nicht" verstehen.
Verstehe auch nicht, warum du die Zeilen nicht mal auseinandernimmst, anstatt einfach nur das abs zu vermuten. f'`8k
Gruß, TGGC (der kostenlose DMC Download)