Ich würde gerne wissen, wie lange die einzelnen Maschinenbefehle bei einem ARM Cortex M7 (STM32F756) brauchen. Mir ist klar, dass die CPU pipelined und superskalar ist und das es deswegen wahrscheinlich keine einzelne Zahl pro Befehl gibt. Bei ST war da sowieso nichts zu finden, aber auch bei ARM bin ich nicht fündig geworden. Jedenfalls konnte ich im "ARM Cortex-M7 Processor Technical Reference Manual" und im "ARMv7-M Architecture Reference Manual" nichts finden. Kennt da jemand so eine Liste?
Google "cortex-m instruction cycle count" der erste Treffer...
Da die Reihenfolge der Ergebnisse bei google davon abhängt, was man sonst so sucht ist eine Angabe wie "erster Treffer bei google" nicht unbedingt zielführend. Ich habe natürlich gegoogelt, aber nicht nach "cortex-M", sondern nach "Cortex-M7", weil die verschiedenen Cortex-M ja unterschiedliche Architekturen haben. Beim Cortex-M4 (der auch ein ARMv7-M ist) stehen im Technical Reference Manual tatsächlich Taktzyklen drin, beim M7 dagegen nicht. Der M7 ist bei gleichem Takt aber deutlich schneller als ein M4.
Der Core des M7 unterscheidet sich drastisch von den M3/M4. Angaben zu M3/M4 sind daher auf den M7 nicht anwendbar. Etwas Information zur Pipeline findet sich in https://semiaccurate.com/2015/04/30/arm-goes-great-detail-m7-core/ Ansonsten scheint ARM dazu keine detaillierte Informationen rauszurücken, zumindest nicht öffentlich als Doku. Allerdings ist das eher für jene Leute relevant, die Compiler darauf optimieren müssen oder extrem zeitkritische Programmteile in Assembler schreiben. Bei solchen Cores aus Angaben über Latency + Throughput von Befehlen und den Abhängigkeiten der Pipelinestages auf die effektiv erreichbare Leistung von Programmen jenseits einiger weniger Befehle zu schliessen ist ausgesprochen schwierig. Für Leute, die das wirklich wissen müssen, scheint es Kurse zu geben.
Das Rechenwerk vom M3/4 und M7 ist das Gleiche. Register nach Register Manipulationen brauchen daher die gleiche Anzahl an Taktzyklen, naemlich fast immer nur einen. Wenn es aber von den Registern in die Peripherie und die verschiedenen RAM/ROMs geht, dann wird es komplizierter. Da hat der M7 Verbesserungen.
Uwe Bonnes schrieb: > Das Rechenwerk vom M3/4 und M7 ist das Gleiche. Register nach Register > Manipulationen brauchen daher die gleiche Anzahl an Taktzyklen, naemlich > fast immer nur einen. Selbst bei den ALU Befehlen ist es nicht ganz so einfach. Wie sieht denn die Laufzeit von ADD R0, R0, R0, #1 ADD R0, R0, R0, #1 ADD R0, R0, R0, #1 ADD R0, R0, R0, #1 bei M3 und M7 aus? Beim M3 gibts 1 Takt pro Befehl, beim M7 wird vmtl. jeder einzelne Befehl 2 Takte benötigen. Bei ADD R0, R0, R0, #1 ADD R1, R1, R1, #1 ADD R0, R0, R0, #1 ADD R1, R1, R1, #1 dürfte es dann 1 Takt pro Befehl sein, und bei ADD R0, R0, R0, #1 ASR R1, #1 ADD R1, R1, R1, #1 ASR R1, #1 möglicherweise 0,5, also 2 Befehle pro Takt. Es reicht schon beim Cortex M3 nicht aus, für die Ermittlung der Laufzeit bloss die Anzahl ausgeführter Befehle zusammenzuzählen. Weil man gelegentlich auch Speicherzugriffe drin hat. Selbst idealisiert nicht, d.h. ohne langsame Peripherie und Waitstates. Je tiefer eine Pipeline ist, desto mehr Abhängigkeiten können zwischen benachbarten Befehlen entstehen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.