ARM Cortex M0+ CoreMark-Bewertungen

Wenn ich derzeit mit Mikrocontrollern arbeite, verwende ich Microchip PICs und bin damit zufrieden. Ich habe mich jedoch entschieden, einfach einen Blick auf ARM für ein mögliches bevorstehendes Projekt zu werfen. Ich wollte den besten (am schnellsten bei Berechnungen am billigen / stromsparenden) ARM auswählen. Auf der ARM-Website ( hier ) ist der Cortex M0+ mit 2,46 CoreMark/MHz gelistet. Ich dachte, dass die CoreMark-Bewertung für alle Mikrocontroller mit M0+-Kernen gelten würde, aber auf der Atmel SAM D20-Seite wird der Mikrocontroller mit 2,14 CoreMark/MHz aufgeführt. Ich habe auf einigen Websites gelesen, dass der Compiler den CoreMark-Score beeinflusst. Ich habe auch Websites gesehen, die einen M0+ mit 1,77 CoreMark/MHz auflisten, ohne über einen Compiler zu sprechen ( element14). Ich habe auch bemerkt, dass ARM über M0+ in einem 40-LP-Prozess spricht, während die Website element14 über ARM in einem 90-LP-Prozess spricht. Leider kenne ich mich mit der Herstellung von Chip-Scale-Prozessoren nicht aus.

Also meine Fragen sind;

  1. Gibt es Varianten des M0+ Prozessorkerns? Wenn ja, wie erkennen Sie, welches welches ist?
  2. Würden alle Mikrocontroller mit ARM Coretex M0+-Kernen dieselbe CoreMark-Bewertung haben, wenn sie in Assemblersprache programmiert würden?

Übrigens ist das Mikro, das ich verwenden möchte, aus der MKL03Z-Familie. Weitere Informationen wären willkommen.

Vielen Dank!

Google: infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0350a/… . Aus TFM ist ziemlich offensichtlich, dass dies ein Benchmarking der CPU plus der Toolchain ist . Die Optimierungsfähigkeit des Compilers und die verwendeten Optimierereinstellungen haben viel größere Auswirkungen als verschiedene implementierte Kernfunktionen.

Antworten (3)

Kurze Antwort:

  1. Ja
  2. Nein

Lange Antwort:

ARM-Kerne haben Funktionen, die jeder Hersteller implementieren kann oder nicht (z. B. Caches, Bus-Fetch-Breite, FPU, MPU usw. - natürlich hängt die Verfügbarkeit vom Kerntyp ab, z. B. 7xx, 9xx, M0, M0+, M3, M7 usw.).

Das Vorhandensein oder Fehlen einer Funktion wirkt sich auf die CPU-Leistung aus.

Das folgende Bild stammt aus dem SAMD21-Datenblatt. Wie Sie sehen können, entscheiden sie sich für die Implementierung eines schnellen Multiplikators und einer 32-Bit-Abrufbreite. Dies ermöglichte dem SAMD21 wahrscheinlich, einen Wert von 2,46 CoreMark/MHz zu erreichen.

Geben Sie hier die Bildbeschreibung ein

Das Datenblatt besagt:

Die SAM D21-Bausteine ​​arbeiten mit einer maximalen Frequenz von 48 MHz und erreichen 2,46 CoreMark/MHz

(Die SAMD20 gibt übrigens auch an, dass sie diese Zahl erreichen kann, und nicht nur 2,14).

Die SAM D20-Geräte arbeiten mit einer maximalen Frequenz von 48 MHz und erreichen 2,46 CoreMark®/MHz.

Wenn Sie in ASM zwei verschiedene Cortex M0+ mit unterschiedlichen Optionen programmiert haben (z. B. einer hat einen langsamen Multiplikator und eine 16-Bit-Busbefehlsabrufbreite und der andere einen schnellen Multiplikator und eine 32-Bit-Abrufbreite), dann wären die Ergebnisse unterschiedlich. Die Ergebnisse wären auch anders, wenn der Test auf Speichern mit unterschiedlichen Zugriffszeiten ausgeführt würde.

Außerdem geben die Coremark-Ergebnisse, die auf der Coremark-Website zu finden sind, die Compiler-Version (und die zum Kompilieren des Tests verwendeten Flags) an. Daher sind sie auch Compiler-abhängig.

Sie finden die konfigurierbaren Optionen direkt von ARM hier in Abschnitt 1.4. Für das, was es wert ist, wurde mir von einem ihrer Ingenieure gesagt, dass Atmel / Microchip im Allgemeinen alles implementieren, was ARM bietet.
Danke für den Kommentar @SpehroPefhany . Ich bin dem Link gefolgt, um es zu lesen. Nur eine kleine Korrektur, die mit der M0-Kernkonfiguration zusammenhängt. Die M0+ Kernkonfiguration ist da Danke!
next-hack Danke, das war eine gute Erklärung und danke auch für den Hinweis auf die Konfigurationstabelle :) @SpehroPefhany Ich wünschte, Freescale (NXP) wäre so klar wie Microchip, was sie getan und was nicht implementiert haben. Die Freescale-Mikros sind so billig! Ich konnte jedoch herausfinden, dass der MKL03Z 32-Bit-Einzelzyklus multipliziert.
@SpehroPefhany. Danke für die Anekdote! Vielleicht hat SAME7 deshalb zum Beispiel im Vergleich zu anderen Cortex M7 von Mitbewerbern so hochwertige Funktionen.

Mir sind keine Varianten des m0+-Kerns bekannt, aber verschiedene Chips haben unterschiedliche Speicherbusverbindungen und FLASH-Controller. FLASH-Speicher sind normalerweise zu langsam, um mit modernen Mikrocontrollern Schritt zu halten. Die meisten Mikrocontroller verfügen über FLASH-Beschleuniger , um den sequentiellen Zugriff zu beschleunigen. Bei wahlfreiem Zugriff, wie einem Sprung oder einer Verzweigung, könnten jedoch mehrere Wartezyklen beteiligt sein.

Dies könnte bedeuten, dass der Controller einen höheren Coremarks/MHz-Wert erreichen kann, wenn der Controller mit einer niedrigeren Taktrate betrieben wird. Natürlich führt der Prozessor bei einer höheren Taktrate mehr Berechnungen durch, was nur bedeutet, dass bei höheren Takten mehr Wartezustände beteiligt sein könnten. Einige Mikrocontroller haben sehr gute FLASH-Beschleuniger, obwohl es fast keine Wartezustände gibt.

Darüber hinaus verfügen einige Mikrocontroller möglicherweise über genügend SRAM-Speicherplatz und -Blöcke, um den Benchmark vom SRAM auszuführen. Dies könnte schneller sein, wenn es keine Konflikte mit dem Datenzugriff gibt. Wahrscheinlich wird ARM mit dieser Technik testen, da sie am Benchmarking ihres CPU-Kerns und nicht an der FLASH-Implementierung eines bestimmten Anbieters interessiert sind.

Wahrscheinlich ebenso dramatisch ist der Fortschritt in der Compiler-Technologie. Dies könnte manchmal sogar noch undeterministischer sein. Compiler können im Normalfall recht gut optimieren, können aber dennoch seltsamen Code erzeugen, der sich auch bei scheinbar nicht zusammenhängenden Codeänderungen ändert (selbst wenn Sie eine bestimmte Routine überhaupt nicht berühren).

Außerdem können meiner Erfahrung nach einige architekturspezifische Compiler-Flags bestimmte Programme schneller und andere langsamer machen. Manchmal erstellt O2 oder sogar Os schnelleren Code in GCC als O3, was zur Optimierung der Geschwindigkeit gedacht war.

Die Coremark-Datenbank listet immer die verwendete Compiler-Version und alle Compiler-Flags des Programms auf. Benchmarker dürfen keine Änderungen am Benchmark-Code vornehmen und greifen daher nicht zu sehr in die Optimierungen ein, die der Compiler vornehmen kann. Sicherzustellen, dass diese Bedingungen erfüllt sind, ist der fairste Vergleich; aber selbst dann kann es hier und da Unterschiede geben.

Gute Antwort, die "Geschwindigkeit pro MHz" ist je nach tatsächlicher Taktfrequenz sehr unterschiedlich, würde ich denken. Die MCU könnte Wartezuständen jedoch mit einem Daten-/Befehls-Cache entgegenwirken, sodass das Vorhandensein/Fehlen eines Caches im Test berücksichtigt werden sollte. Ich denke, ernsthafte Tests würden sowohl Tests bei niedrigem als auch bei hohem Takt beinhalten. (1MHz gegenüber 100MHz oder so ähnlich.)
Ernsthafte Tests würden die tatsächliche Anwendung mit der Zieltaktgeschwindigkeit beinhalten - kein synthetischer Benchmark ...
@SeanHoulihane Immer. CPUs sind so konzipiert, dass sie in Benchmarks gut abschneiden, da dies die üblichen Fälle sind. ZB hat der Kortex m0+ nicht einmal einen obligatorischen Single-Cycle-Multiplikator. Das könnte sogar bedeuten, dass ein 8-Bit-AVR schneller ist. Wenn Ihre Anwendung viele dieser Vorgänge ausführt, stellen Sie sicher, dass sie verfügbar ist. Aber "Ihre Bewerbung" in "Ich brauche mindestens x Coremarks" zu übersetzen ist (fast) unmöglich, also immer testen.

Das Datenblatt des SAM D20 bezieht sich ebenfalls auf 2.46. Wie Sie sehen können, wenn Sie dem Link auf der Arm-Site zum EEMBC-Ergebnis folgen, machen die Speicherkonfiguration, der Compiler und die Compiler-Flags einen Unterschied in den Ergebnissen eines Benchmarks. Da der Benchmark in C geschrieben ist, ist es notwendig, einen Compiler zu verwenden, anstatt in Assembler zu schreiben. Dies liegt in der Natur von Benchmarks, sie beinhalten einen Aspekt, wie gut ein Compiler auf den Kern abzielt (und wie gut der spezifische C-Code auf die Hardware abgebildet wird).

Cortex-M0+ kann entweder mit einem schnellen oder einem kleinen Multiplikator konfiguriert werden. Das Datenblatt für das Teil hier gibt an, dass die Einzelzyklus-Multiplikation implementiert ist. Seite 40 des Datenblatts gibt an, dass r0p1 des Arm-Kerns implementiert ist.

Ein wichtiger Faktor zwischen verschiedenen Low-Power-MCU-Teilen könnte die Speicherarchitektur sein. Zum Beispiel die Flash-Speicherbreite, das Zwischenpuffern von Befehlsabrufen usw. Es ist beispielsweise möglich, einen 16 Bit breiten Befehls-Flash-Speicher zu implementieren (da der Befehlssatz Thumb ist) oder eine CPU-Taktrate zu haben, die höher als die Flash-Geschwindigkeit ist (und vielleicht eine breite Flash-Schnittstelle) - alle mit unterschiedlichen Kompromissen.

Ich habe Ihre Frage dreimal gelesen, bevor es geklickt hat, warum Sie einen Compiler anstelle von Assembly verwenden mussten, meine Güte: D! Danke für die Antwort war hilfreich.
Echter Code wird fast immer kompiliert. Es gibt nur sehr wenige Entwickler, die einen schnelleren Assembler von Hand schreiben können, als ein moderner Compiler für ein komplexes Problem generiert.