Performance Optimieren -> Werkzeuge od. Tricks?



  • Hallo liebes C++ Forum,

    ich habe eine Anwendung geschrieben die größer ist. (> 10k Code).
    Es handelt sich um numerische Algorithmen.
    Nun will ich ein sauberes Performance-Testing machen.

    Es geht um Folgendes: Je nach Problemgröße (input) will ich mir genau anschauen können wie aufwändig gewisse Teile des Codes (des Algorithmuses) sind und dann dort gezielt optimieren.

    Mir fällt spontan nur folgendes ein:
    * Profiling: Über Profiler (z.B. kcachegrind o.ä.) mir den prozentualen Anteil an der Obermethode anzeigen lassen.
    * Zeitmessungen in Sekunden.

    Mein Problem/Frage:

    Ich brauche ein verlässliches Werkzeug das mir genau zeigt wie teuer eine Methode (ein Teil) ist. Nur weiß ich nicht welches Werkzeug möglichst genau ist und nicht von irgendwelchen Prozessen beeinflusst wird? Wie geht ihr vor? Gibt es spezielle Tools (unter Linux) mit welchen sich genau die Zeit (Prozent oder sonstwie) messen lassen kann? Worauf muss ich achten? (Möglichst wenig Prozesse beim laufen?). Habt ihr spezielle Tricks?

    Ich danke euch für eine geduldige Antwort
    🙂



  • Ich denke mal, dass du mit einem Profiler sicher gut versorgt bist. Die sind ja genau für das da. Zeitmessung würde ich da nicht nehmen, da du da im Code ja ev. etwas ändern musst und das ist zwar für schnelle vergleiche ganz ok, aber für richtig genaue Analyse würde ich da auch eher zu einem Profiler greifen.



  • Danke erstmal.

    Aber sind die Profiler auch wirklich genau? Wie sind denn so die Einflüsse der Hardware bzw. anderer Prozesse die gerade laufen? Baut der Profiler irgendwie eine Umgebung auf die "nicht gestört" wird? Und welchen Profiler nehmt ihr denn so her?

    Danke



  • Hab bisher nur mit gprof gearbeitet. Um "genauere" Ergebnisse zu erzielen muss man es wohl einfach ein paar mal mehr durchlaufen lassen und mitteln. 😉



  • Ich benutze den CodeAnalyst von AMD:
    http://developer.amd.com/CPU/CODEANALYST/Pages/default.aspx

    Ich weiss nicht, wie genau er wirklich ist, aber ich habe damit schnell die wirklichen Bottlenecks meiner App's gefunden. (Habe glaube ich auch mal ein mit Absicht ein paar anderen Anwendungen gestartet und hat immernoch gut funktioniert).



  • Ich danke euch - mir geht es aber ernsthaft darum nicht nur Bottlenecks zu prüfen sondern ich muss/will ein Kosten/Nutzen Verhältnis aufstellen. Ich brauche die genauen Ergebnisse weil das dann veröffentlicht werden sollen - deswegen frage ich so penetrant...also mich würde da auch interessieren welche Seiteneffekte miteinfließen....evtl. sollte ich im code die Flop-Zahl mitrechnen lassen und anhand der Flops messen über die Zeit?

    Über jede Diskussion bin ich dankbar



  • Und der AMD Analyzier ist ja nur für AMD CPUs...ich bräuchte da schon was unabhängiges...



  • Geht auch mit Intel CPU's. Und du kannst dort genau jede Funktion anschauen, wie es im Verhältnis aussieht. Und je nach Einstellung auch die Zeit.


  • Mod

    Sowas kannst du mit einem Profiler machen, der die benötigten Taktschritte zählt und nicht die Zeit. Das sollten eigentlich die meisten Profiler auch können. Dann ist dein Ergebnis vollkommen unabhängig von der Systemauslastung.

    Wenn du dann noch zeigen willst, wie gut dein Code ist (sofern er es ist), kannst du dann noch die Flops/Taktschritt deines Programms ausrechnen und mit dem theoretischen Maximum deiner Architektur vergleichen. Hochoptimierte Numerikprogramme machen diese Angabe oft um zu zeigen wie effizient sie mit der Rechenzeit umgehen, aber mit denen wirst du dich kaum messen können.



  • Wenn du dann noch zeigen willst, wie gut dein Code ist (sofern er es ist), kannst du dann noch die Flops/Taktschritt deines Programms ausrechnen und mit dem theoretischen Maximum deiner Architektur vergleichen. Hochoptimierte Numerikprogramme machen diese Angabe oft um zu zeigen wie effizient sie mit der Rechenzeit umgehen, aber mit denen wirst du dich kaum messen können.

    Sehr interessant - danke für den Hinweis. Wie berechne ich mir denn die Flops/Taktschritt in meinem Programm? Ginge das auch über die Profiler?


  • Mod

    Bleistift schrieb:

    Sehr interessant - danke für den Hinweis. Wie berechne ich mir denn die Flops/Taktschritt in meinem Programm? Ginge das auch über die Profiler?

    Die paar Male die ich das gemacht habe, habe ich das über einen Profiler gemacht. Das war allerdings ein Profiler der speziell für eben jenen Rechner (bzw. jene Rechnerarchitektur) gemacht war. Ich weiß nicht, ob normale Profiler das auch können, weil ich die nicht so häufig verwende. Ich muss die Frage deshalb an die Allgemeinheit weitergeben.



  • drakon schrieb:

    Geht auch mit Intel CPU's. Und du kannst dort genau jede Funktion anschauen, wie es im Verhältnis aussieht. Und je nach Einstellung auch die Zeit.

    Der AMD Code Analyst geht zwar mit Intel CPUs, allerdings ist die Funktion gröbstens eingeschränkt (nur Interval-Sampler mit dem kürzesten Interval = 1ms -> ein schlechter Scherz).



  • hustbaer schrieb:

    drakon schrieb:

    Geht auch mit Intel CPU's. Und du kannst dort genau jede Funktion anschauen, wie es im Verhältnis aussieht. Und je nach Einstellung auch die Zeit.

    Der AMD Code Analyst geht zwar mit Intel CPUs, allerdings ist die Funktion gröbstens eingeschränkt (nur Interval-Sampler mit dem kürzesten Interval = 1ms -> ein schlechter Scherz).

    Welchen Profiler benutzt man dann für Intel CPUs bzw gibt es nicht einfach einen, der auf Intels und AMDs läuft?



  • Ich kenne keinen Profiler der gratis wäre und auf Intel CPUs gut läuft. Leider.
    Nicht-gratis Teile gibt's, z.B. den VTune von Intel (wobei ich aber wieder nicht weiss wie gut der wieder mit AMD CPUs funktioniert).

    Wer andere kennt bitte ergänzen.

    (Die GNU Toolchain müsste auch was haben, wobei die vermutlich dann nur mit GNU Compilaten funktioniert?)



  • Für die GNU Toolchain kenne ich gprof bzw. callgrind mit dem Interface kcachegrind. Und genau hier würde mich interessieren wie genau die sind...

    Hat jemand Erfahrungswerte?



  • Was wäre mit einem Monitoring? Wäre wohl die Art über RDTSC Funktionen zu klammern und clocks zu zählen oder?

    Oder ist Profiling die sauberste Art bottlenecks zu finden?



  • Profiling ist IMO die praktikabelste Art Hot-Spots zu finden.
    Man muss am Code nix ändern, und man bekommt - je nach Profiler - viel mehr als nur die Info wieviel Zeit in Funktion XYZ verbracht wurde.

    VTune z.B. kann einem einen schönen Call-Graph erstellen, wo man genau sieht welche Funktion welche anderen Funktionen wie oft aufgerufen hat, wie viel Zeit dabei draufgeganen ist etc. Dieser lässt sich dann auch rückwärts navigieren, d.h. wenn ich weiss Funktion X ist mein Hot-Spot, dann kann ich zurückgehen, und sehe vielleicht dass 2% der Aufrufe von Funktion A kommen, 5% der Aufrufe von Funktion B, und der Rest von Funktion C. Das ist sehr oft wichtig, da oft die Funktion "am Ende des Callstacks" (X) nichtmehr sinnvoll optimiert werden kann, dafür Funktionen "davor" (A, B, C) leichter so umgestellt werden können dass sie die betreffende Funktion (X) nichtmehr so oft aufrufen.

    Weiters können manche Profiler noch andere Dinge "messen", z.B. wie oft man Cache-Misses an bestimmten Programmstellen produziert, wie oft man die Pipeline stallt und vieles mehr.

    ----

    Manuell Funktionen mit RDTSC zu spicken kann Sinn machen wenn man nur ein sehr kleines Stück Code "ausmessen" will, bei grossen Projekten ist sowas aber absolut undurchführbar. (Es sei denn man lässt diese Änderung am Code automatisch durch irgendein Tool durchführen -- wobei ich so ein Tool dann schonwieder als Profiler bezeichnen würde)



  • Danke für den Beitrag. Nur ich glaube Vtune ist wohl nicht kostenlos...kann das sein? Zumindest lese ich es überall dass es kostenpflichtig ist...



  • Wie sieht es eigentlich mit parallelem Profiling aus? Gäbe es da überhaupt eine Möglichkeit? Oder liegt hier das Problem genau da wo es beim parallelen Debugging liegt?



  • Leider richtig, VTune kostet ganz dick $$$
    Dass der nicht kostenlos ist hab ich aber auch schon ganz klar geschrieben, hättest du halt lesen müssen. 🙄
    (Davon abgesehen bekommt das jeder der nicht total dämlich und/oder total faul ist in 5 Minuten selbst raus -- Zugang zum Internet vorausgesetzt)

    Aber WTF meinst du mit "parallelem profiling"? Jeder gute Profiler kann Programme mit mehreren Threads profilen, auch wenn diese auf mehreren Cores laufen. Gewisse spezielle Dinge sind natürlich u.U. nicht einfach zu finden, Sachen wie Priority Inversion, Kämpfe darum "wem welche Cache Line gehört" etc.
    Gewisse Hilfestellung bekommt man von einigen guten Profilern allerdings sogar bei diesen Sachen.

    ----

    BTW: wer einen Profiler für "Wintel" kennt der gratis ist und auch nur halbwegs gut (eben nicht so ein Ranz wie AMD Code-Analyse im Zusammenspiel mit ner Intel CPU): daran wäre ich auch sehr interessiert.


Anmelden zum Antworten