Wie können Sie testen, wie viele Anweisungen pro Sekunde Ihr Computer ausführen kann?

Lesezeit: 8 Minuten

Gibt es eine schnelle/einfache Möglichkeit, dies zu tun (zumindest für eine grobe Schätzung)?

Ich bewerte Algorithmen und dachte, es wäre cool, die absolute Geschwindigkeit zu kennen, mit der mein Computer Anweisungen ausführt, und diese mit meiner asymptotischen Analyse zu vergleichen.

  • Nein, gibt es wirklich nicht (ein einfacher Weg). Das Problem ist ziemlich einfach: Die Anzahl der Anweisungen, die Ihr Computer ausführen kann, hängt (stark) von der Mischung und Reihenfolge dieser Anweisungen ab. Um ein Ergebnis zu erhalten, das irgendetwas bedeutet, wird normalerweise das Ergebnis eines bekannten Benchmarks verwendet – aber aussagekräftige Benchmarks sind normalerweise ziemlich komplex. Auch dann muss man vorsichtig sein – die Zahlen bedeuten oft weniger als erwartet.

    – Jerry Sarg

    19. August 2013 um 7:22 Uhr


  • @DanielKO Der Whetstone-Benchmark wurde ursprünglich in Algol geschrieben, basierend auf Statistiken, die etwa 1970 vom British National Physics Lab gesammelt wurden, wobei jedoch nur ein Array mit vier Elementen zum Testen des Array-Zugriffs verwendet wurde. Es wurde dann in Fortran übersetzt. Dhrystone basierte auf ähnlichen Prinzipien, in verschiedenen Sprachen, in Ada geschrieben, aber in C übersetzt. Als ich es vor etwa 30 Jahren zum ersten Mal studierte, hielt ich Whetstone für veraltet und unrealistisch.

    – Patricia Shanahan

    19. August 2013 um 8:26 Uhr

  • @DanielKO Der Punkt ist, dass Arrays mit vier Elementen und Schleifen, die auf sie zugreifen, auf eine Weise optimiert werden können, die für größere Arrays nicht anwendbar ist, und die vier sind die einzige Arraygröße in Whetstone. Obwohl ich die Daten bei Wikipedia überprüft habe, war mir die Geschichte von Whetstone schon lange bekannt, bevor es Wikipedia gab.

    – Patricia Shanahan

    19. August 2013 um 8:48 Uhr

  • ‘Diese 30 Jahre alte Benchmark ist immer noch weit verbreitet, und daher kommt es einer “groben Schätzung” am nächsten‘. Habe ich eine wichtige Information verpasst, die machen würde das Fazit erscheint logisch? 🙂

    – jalf

    19. August 2013 um 9:17 Uhr


  • Wenn Sie den ursprünglichen Dhrystone-Benchmark nehmen und ihn mit gcc -O3 (vor einigen Jahren) kompilieren, erhalten Sie Fantasiezahlen, da (mindestens) eine der Schleifen zu nichts gemacht wird und somit null Zeit benötigt. Anweisungen pro Sekunde ist die Anzahl der Anweisungen / Zeit -> unendliche Anzahl. Aber der Gesamtbenchmark ist nicht null Zeit, also landen Sie bei einer Fantasiezahl im 100-1000-fachen der Theorie des Prozessors. Es gibt Tricks, die Sie anwenden können, um den Compiler glauben zu machen, dass Sie den Code innerhalb der Schleife benötigen, aber das ist nicht mehr die ursprüngliche Quelle. Außerdem basiert Drhystone auf VAX-Anweisungen.

    – Mats Petersson

    19. August 2013 um 9:30 Uhr


Benutzer-Avatar
jalf

Wenn Sie wissen wollen, was Ihre CPU tun können, dann schauen Sie sich die Dokumentation an. Ihr CPU-Anbieter gibt die Latenz und den Durchsatz aller Befehle sowie eine Vielzahl anderer Informationen an (wie viele Befehle pro Zyklus ausgegeben oder zurückgezogen werden können, Cache-Latenzen und vieles mehr). Auf dieser Grundlage können Sie den theoretischen Spitzendurchsatz berechnen.

Wenn Sie tun möchten, was Ihre CPU ist tatsächlich tun Führen Sie dann Ihren eigenen Code aus und messen Sie seine Leistung.

Denken Sie jedoch daran, dass moderne CPUs wirklich komplexe Bestien sind und ihre Leistung von einer Vielzahl von Faktoren abhängt, und Sie werden sehr selten in der Lage sein, Ihre CPU auch nur annähernd auszureizen und zu verstehen warum, oder was genau Ihren Code zurückhält, erfordert ein ziemlich gründliches Verständnis der Hardware. (Meine übliche Faustregel ist, dass Sie sehr gut abschneiden, wenn Sie dauerhaft 30-40 % der theoretischen Spitzen-FLOPS erreichen.)

  • Oder lassen Sie sich einfach den Kernel geben BogoMIPS. Sie ist mindestens so nützlich wie jede theoretische (d. h. kontextunabhängige) Schätzung.

    – DanielKO

    19. August 2013 um 7:47 Uhr


  • @DanielKO außer “was die Dokumentation sagt” ist kaum “von jedem Kontext getrennt”. Es handelt sich um harte Fakten darüber, wie Ihre CPU funktioniert und wozu sie in der Lage ist, was sehr relevant ist, wenn Sie versuchen, Ihren Code gut auszuführen. Aber ja, wenn Sie nur eine schnelle Schätzung wünschen, die viele Nuancen wegwirft, dann könnte diese Zahl ein sehr guter Kandidat sein.

    – jalf

    19. August 2013 um 7:54 Uhr


  • @jalf: Anweisungen werden nicht unabhängig voneinander ausgeführt, sodass selbst eine gründliche Beschreibung der Ausführung jeder Anweisung wenig darüber verrät, was während der Ausführung tatsächlich passieren wird. Cache-Fehltreffer, falsche Verzweigungsvorhersagen, Datenabhängigkeiten usw., dies ist Teil des Kontexts, den ich erwähnt habe.

    – DanielKO

    19. August 2013 um 8:08 Uhr

  • @DanielKO ja. Nichts davon widerspricht meiner Antwort in irgendeiner Weise, oder? Aber wenn Sie den maximalen theoretischen Durchsatz wissen möchten, zu dem Ihre CPU bei perfekt optimalem Code fähig ist, dann gehen Sie davon aus, dass es keine Cache-Fehlschläge, Verzweigungs-Fehlvorhersagen oder Datenabhängigkeiten gibt. All dies kann helfen, das Warum zu erklären dein Code ist viel, viel langsamer als dieses theoretische Maximum, das ist der ganze Punkt.

    – jalf

    19. August 2013 um 9:11 Uhr

Benutzer-Avatar
Matt Petersson

Dies ist ein typischer Fall von „In der Theorie sind Theorie und Praxis gleich, in der Praxis sind sie es nicht“.

Moderne CPUs verfügen über eine sehr ausgefeilte Logik, was bedeutet, dass die TATSÄCHLICHE Anzahl der durchgeführten Operationen sich von dem unterscheidet, was Sie denken würden, wenn Sie sich nur den Code ansehen oder über das Problem nachdenken [unless you have a brain the size of a small planet and know how that particular CPU works]. Beispielsweise kann ein Prozessor spekulativ Anweisungen auf der einen oder anderen Seite einer Verzweigung ausführen, selbst wenn er die Verzweigung noch nicht ganz erreicht hat – wenn dies die “falsche” Seite ist, dann wird er die Ergebnisse dieser Anweisungen verwerfen – aber von Natürlich brauchte es Zeit, sie auszuführen.

Anweisungen werden auch außerhalb der Reihenfolge ausgeführt, was bedeutet, dass es schwierig ist, genau vorherzusagen, welche Anweisung wann ausgeführt wird. Es gibt einige Ausnahmen.

Sie erhalten (annähernd) nur den theoretischen Durchsatz, wenn Sie Daten und Anweisungen gleichzeitig durch alle verfügbaren Ausführungseinheiten schieben – das bedeutet, dass Sie die richtige Mischung aus Anweisungen und natürlich ALLEN Code und Daten in Caches haben.

Theoretisch könnten wir also den Prozessor mit Anweisungen vollstopfen, die ihn ausreizen, indem wir sehr cleveren Code schreiben. In der Praxis wird das sehr sehr sehr schnell zu einer kniffligen Aufgabe.

Die Frage ist jedoch die Messung des Durchsatzes von Anweisungen, und auf modernen CPUs ist dies mit der richtigen zusätzlichen Software sehr gut möglich. Unter Linux gibt es perftool oder oprofile, für Windows gibt es Intels VTune und AMDs Code Analyst. Diese ermöglichen es Ihnen (vorbehaltlich ausreichender Berechtigungen), die „Leistungsindikatoren“ im Prozessor abzurufen, die Zähler für „Anzahl der Anweisungen“, „Anzahl der Float-Operationen“, „Anzahl der Cache-Fehlschläge“, „Verzweigung falsch vorhergesagt“ und viele, viele andere Messungen der Prozessorleistung. Bei einer ausreichend langen Laufzeit (mindestens einige Sekunden, besser mehr) können Sie also die tatsächliche Anzahl oder Taktzyklen messen, die ein Prozessor durchführt.

  • “… das dreht sich sehr sehr sehr schnell.”, können wir einen Dynamo anschließen und ihn als Energiequelle nutzen?

    – DanielKO

    19. August 2013 um 8:45 Uhr

  • Für „Spaß an der Theorie“; Auf modernen CPUs (z. B. Intel Nehalem und höher mit “Loop-Stream-Detektoren”) würde ich in Betracht ziehen, eine Schleife mit Einzelbyte zu versuchen NOP Anweisungen (damit die Anweisungen vom Front-End verworfen werden und nicht in den Micro-Op-Puffer gelangen). Ich vermute, Sie können auf diese Weise wahrscheinlich “theoretisch 100 Anweisungen pro Zyklus” überschreiten.

    – Brenda

    21. Februar 2019 um 12:52 Uhr

  • @Brendan: Nein, Intel-CPUs führen zumindest NOPs über die gesamte Pipeline aus. Sie nehmen einen Platz im ROB ein, aber null im RS (unfusionierte Domäne: keine Ausführungseinheit erforderlich). Dies gilt definitiv für die SnB-Familie, aber ich habe Nehalem nicht getestet. Sie vor der Ausgabe in das Backend zu verwerfen, mag praktisch sein, ist aber keine sehr wertvolle Optimierung. Vermutlich lohnt es sich nicht, die erste Anweisung nach den NOPs bei einem RIP zu starten, der nicht das Ende der vorherigen Anweisung ist, ohne Sprung. Auch Leistungszähler für “Anweisungen” wären falsch. (Allerdings kein Dealbreak.)

    – Peter Cordes

    21. Februar 2019 um 23:28 Uhr

Benutzer-Avatar
Marc Klaesen

In der Praxis hängt die effektive Anzahl von Anweisungen heutzutage hauptsächlich von der Speicherlatenz ab, die der Hauptengpass für die Leistung ist. Das Warten auf Daten ist schlecht. Prozessoren können dieses Problem mit Techniken wie Caching, Pipelining und Parallelität etwas lindern, aber das Problem bleibt und wird sich mit der Zeit nur noch verschlimmern.

Die richtige Umsetzung kann a riesig Unterschied. Vielleicht möchten Sie sich diese Frage zu Cache-freundlichem Code ansehen.

Moderne CPUs leiten die Befehlsverarbeitung weiter, daher gibt es keine Konstante als solche.

Sie können jedoch die Anzahl der CPU-Ticks am Anfang Ihres Algorithmus und am Ende auslesen. Ich denke, das ist das niedrigste Niveau, das Sie mit einer solchen Messung erreichen können.

http://en.wikipedia.org/wiki/Time_Stamp_Counter

Hinweis: Es gibt viele Probleme, warum dies nicht 100% genau sein wird, ich kann nur wenige nennen, aber ich bin sicher, dass die Community der Liste etwas hinzufügen kann: -OS preempting you process -cache misses (algo wird beim ersten Mal langsamer laufen, schneller, wenn es später ausgeführt wird) – Auf älteren CPUs sind die CPU-Ticks nicht unveränderlich von der CPU-Frequenz

Sie können das Perf-Tool unter Linux verwenden. Es ist einfach zu bedienen.

Um Statistiken über CPU-Zyklen, Anweisungen pro Zyklus (IPC), Cache-Treffer/Fehlschläge usw. zu erhalten, führen Sie Ihr Programm einfach mit Perf aus. Ein Beispielbefehl ist

Leistungsstatistik -d <exename>

Für weitere Informationen besuchen Sie http://www.brendangregg.com/perf.html oder https://perf.wiki.kernel.org/index.php/Tutorial

1216460cookie-checkWie können Sie testen, wie viele Anweisungen pro Sekunde Ihr Computer ausführen kann?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy