2016-04-05 26 views
1

Ich habe einen Dual-Core-ARM A9-basierten Prozessor, den ich brauche, um einige ziemlich bestimmte Nanosekunden-Timing mit. Ich plane, die NOP-Assembleranweisung zu verwenden, um dies zu erreichen, indem ich die Anzahl der Nanosekunden pro Zyklus des Systemtakts festlege.NOPs auf Multicore ARM A9

Ich frage mich, ob es irgendwelche besonderen Überlegungen geben sollte, wenn ich die NOPs anrufe, wenn es um einen Dual-Core-ARM-Prozessor geht, da ich mich immer nur mit Single-Core-ATMEL- und ARM-Prozessoren beschäftigen musste. Wird der Prozessor versuchen, die NOPs automatisch über die beiden Kerne zu verteilen? Sollte ich meine Timing-Berechnung für die doppelte Systemtaktfrequenz (667 MHz) durchführen, um die beiden Kerne zu berücksichtigen? Gibt es noch andere spezielle Überlegungen, die mir nicht im Weg stehen?

+2

Nein, jeder Kern hat seinen eigenen Befehlsstrom. Sie müssen auch nicht verdoppeln. Sie haben nicht gesagt, ob Sie ein Betriebssystem oder Interrupts aktiviert haben. Diese Dinge könnten dein Timing durcheinander bringen;) Auch keine Ahnung, ob ARM-CPUs Taktfrequenz-Skalierung (Power Saving) machen. – Jester

+1

Was Sie versuchen zu tun, ist wahrscheinlich nicht haltbar. Der ARM Cortex-A9 verwendet superskalare Out-of-Order-Kerne mit einer Pipeline mit 8 bis 11 Stufen. Selbst ohne externe Ereignisse zu berücksichtigen, müsste man die genauen Instruktionszeiten berechnen, wenn ARM alles vollständig dokumentiert. Stattdessen heißt es in der Dokumentation: "Die Komplexität des Cortex-A9-Prozessors macht es unmöglich, präzise Timing-Informationen manuell zu berechnen. Das Timing einer Anweisung wird oft durch andere gleichzeitige Anweisungen, Speichersystemaktivität und zusätzliche Ereignisse außerhalb des Anweisungsflusses beeinflusst." –

+0

Aus Interesse, was ist die tatsächliche Art der Verzögerung? Es könnte kreativere Wege geben, es anzugehen - eines der coolsten Dinge, die ich gesehen habe, war ein Peripheriegerät, das eine genaue Verzögerung in der Größenordnung von ein paar hundert Buszyklen zwischen Operationen benötigte; es hatte ein zusätzliches Register in seiner Programmierschnittstelle, das absolut nichts tat, aber die erforderlichen paar hundert Zyklen benötigte, um 0 zurückzugeben, wenn es gelesen wurde: D – Notlikethat

Antwort

2

Wenn Sie ein einzelnes Programm ausführen, das kein Multithread ist, gibt es keine Möglichkeit, es auf beiden CPUs auszuführen. Es läuft immer auf einer CPU (obwohl Sie nicht wissen, welche).

Die Verwendung von NOP zur Berechnung des Timings ist wirklich keine gute Idee, da Sie keine Kontrolle darüber haben, wie Anweisungen ausgegeben und ausgeführt werden, insbesondere weil Cortex-A9 mehrere Ausführungseinheiten hat.

Obwohl ich glaube nicht, dass dies eine sehr zuverlässige Lösung ist, sollten Sie zumindest eine Folge von abhängigen Befehlen verwenden, die einen Timing von 1 Zyklus haben:

ADD r0, r0, r0 
ADD r0, r0, r0 
... 

Dies wird dazu beitragen, pro Zyklus einen Befehl mit, besser als NOP-Operationen, aber dies wird immer noch eine Annäherung sein.

+0

Das OP muss seine Verzögerungsschleife immer noch kalibrieren, aber es ist latenzgebunden anstatt durch den Durchsatz gebunden zu sein, ein guter Vorschlag, der den Effekt des Hinzufügens eines Befehls zur Schleife vorhersehbarer machen sollte. (Latenzzeit zu sparen, spart wahrscheinlich auch ein bisschen Leistung. "ODER" oder "UND" könnte hier sogar eine geringere Leistung sein. Gibt es Anweisungen mit geringer Komplexität, aber höherer Latenz? Vielleicht eine Geschäftsweiterleitung?) –

+0

In der Tat ist es eher der ganze Sinn der architektonischen 'nop'-Anweisung, dass sie früh aus dem Befehlsstrom entfernt und in 0 Zyklen 'ausgeführt' werden kann - ich glaube nicht, dass Cortex-A9 das tatsächlich tut, sondern etwas High-End Kerne könnten. – Notlikethat

+0

Das war alles sehr hilfreich, die obige Antwort ist mehr als genug, ich hatte ursprünglich vorgeschlagen, nop einfach wegen dem, was ich in anderen Code gesehen hatte versucht, ähnliche Timing durchzuführen.Wenn meine Mathematik stimmt, habe ich etwa 350 Taktzyklen in beiden Richtungen des Timings, ich hoffe, dass die Einführung des ADD r0, r0, r0-Konzepts mich so nah wie möglich am richtigen Timing halten wird. – brad95411