Ich möchte mehrere CPU-Anweisungen in meinem Code zählen. z.B. Ich würde gerne wissen, wie viele Additionen, wie viele Multiplikationen, wie viele Float-Operationen, wie viele Zweige mein Code ausführt. Ich benutze derzeit gprof unter Linux für die Profilerstellung meines C++ - Codes, aber es gibt nur die Anzahl der Aufrufe an meine Funktionen, und ich manuell die Anzahl der Anweisungen schätzen. Gibt es irgendwelche Werkzeuge, die den Trick für mich tun könnten? Vielleicht eine virtuelle Maschine?Profilierungsanweisungen
Antwort
Wenn Sie wirklich Anweisungen zählen müssen, dann ist es wahrscheinlich am besten, Assembler zu generieren und dann die Ausgabe an ein intelligentes grep-Äquivalent zu übergeben. Versuchen Sie für gcc
den -S
Schalter.
einfach zu erreichen, wird befehl zählt eine nützliche Art und Weise Code Leistung zum Profil?
Ich weiß, dass man in den Tagen der "einfachen" CPU-Designs vernünftigerweise davon ausgehen konnte, dass jeder Opcode genau so viele Nanosekunden CPU-Zeit benötigt, aber heutzutage mit all den komplexen Speicher-Caching-Schemata, On-the-fly-Opcode-Neuordnung, Pipelining, Superskalar-Architektur und alles, was sonst noch in die moderne CPU geworfen wurde, gibt das einfache Zählen von Opcode-Ausführungen noch einen Hinweis darauf, wie lange der Code dauern wird? Oder wird sich die Ausführungszeit auf der Grundlage von (beispielsweise) Speicherzugriffsmustern und der Sequence, in der Opcodes ausgeführt werden, genauso wie auf der Rohfrequenz der Ausführung der Opcodes ändern?
Mein Verdacht ist, dass die einzige Möglichkeit, Code-Performance in diesen Tagen zuverlässig vorherzusagen, tatsächlich den Code auf der Zielarchitektur ausführen und es Zeit .... dh oft wenn es scheint, dass der Compiler ineffizienten Code emittiert hat, ist es tatsächlich etwas cleveres tun, das die subtile Eigenschaft der modernen CPU-Architektur ausnutzt.
Tatsächlich gibt es mehr Variablen als je zuvor und eine genaue Vorhersage ist schwierig. Und es gibt viele Faktoren, die wichtiger sind als die Anzahl der Anweisungen. Nichtsdestoweniger waren bestimmte Beziehungen wahr und bleiben für die vorhersehbare Zukunft wie Kosten (hinzufügen) <= Kosten (Multiplizieren) <= Kosten (Dividieren) <= Kosten (Quadratwurzel) wahr. Ersetzen Sie eine Division durch eine Multiplikation, ist es unwahrscheinlich, die Leistung zu beeinträchtigen und kann helfen. –
Sie sind in Bezug auf die Leistung korrekt. Mein Ziel ist jedoch nicht, meinen Code für die Leistung zu optimieren, sondern andere Arten der Analyse (Befehlstypen und Häufigkeit). –
Intels vtune ist kostenlos für Linux-Benutzer, AFAIK (vorausgesetzt, wir sprechen über eine Intel-basierte x86-Linux-Maschine). Es wird Ihnen alle Informationen geben, die Sie brauchen und SOOO viel mehr.
Dies ist ein allgemeiner Hinweis, nicht-Linux-spezifisch: Sie sollten stattdessen CPU-Zyklen interessiert sein. Vergessen Sie die Anzahl der Anweisungen als Maß für die Leistung. Eine Anleitung kann die gleiche wie die anderen 10 zusammen kosten, also wird es dir nichts erzählen.
Sie sollten sich auf die CPU-Zyklen und in Multithread-Umgebungen (die meisten, wenn nicht alle heute) in der Zeit konzentrieren, in der der Thread in den Ruhezustand versetzt wird ("aus-/ausgeschaltet"), was Ihnen die Zeit anzeigt Warten auf die Fertigstellung von E/A, DB usw. und auf die privilegierte CPU-Zeit.
+1 Und Speicherzugriff (Cache Hits/Misses) kann eine große Rolle bei der Bestimmung der tatsächlichen Leistung spielen, während die Anzahl der Operationen werden nichts darüber sagen. – sharptooth
Sie können pin-instat verwenden, das ein PIN Werkzeug ist. Um es zu verwenden, müssen Sie die PIN installieren. Die Befehlszählung allein sagt jedoch nicht viel über die Leistung aus. Cache-Miss, Verzweigungsprognose spielt auch große Rollen.
Haftungsausschluss: Ich bin der Autor von Pin-instat.
Zählt Befehle nicht direkt, sondern hilft beim Durchsuchen der Baugruppe auf sehr bequeme Weise. Vielen Dank. –