Wie können Sie versichern Ihr Code läuft ohne Variabilität in der Ausführungszeit-Cache wegen?

StackOverflow https://stackoverflow.com/questions/69049

Frage

In einer eingebetteten Anwendung (in C geschrieben, auf einem 32-Bit-Prozessor) mit harten Echtzeitbedingungen, die Ausführungszeit von kritischem Code (speziell Interrupts) muss konstant sein.

Wie versichern Sie, dass die Zeit Variabilität nicht eingeführt wird in der Ausführung des Codes, und zwar aufgrund des Caches des Prozessors (sei es L1, L2 oder L3)?

Beachten Sie, dass wir mit Cache-Verhalten betroffen sind aufgrund der großen Wirkung auf die Ausführungsgeschwindigkeit hat (manchmal mehr als 100: 1 gegen den Zugriff RAM). Variability eingeführt aufgrund der spezifischen Prozessorarchitektur ist bei weitem nicht die Größe des Cache.

War es hilfreich?

Lösung

Wenn Sie Ihre Hände auf der Hardware zu bekommen, oder mit jemandem zusammenarbeiten, können Sie den Cache ausschalten. Einige CPUs verfügen über einen Stift, der, wenn man statt der Macht an Masse verdrahtet (oder vielleicht auch andersrum), werden alle internen Caches deaktivieren. Das wird Vorhersagbarkeit geben, aber nicht beschleunigen!

Gelingt das nicht, vielleicht an bestimmten Stellen in dem Software-Code geschrieben werden könnte, um bewusst den Cache mit Junk zu füllen, so was auch immer passiert garantiert wird nächstes kann eine Cache-Miss sein. Richtig gemacht, das kann Vorhersagbarkeit geben, und vielleicht nur an bestimmten Orten getan werden könnte, so Geschwindigkeit als völlig deaktivieren Caches besser sein kann.

Schließlich, wenn die Geschwindigkeit nicht egal - sorgfältig die Software entwerfen und Daten, als ob in dem alten Tag der Programmierung für ein altes 8-Bit-CPU - halten sie klein genug für sie alle in L1-Cache passen. Ich bin immer wieder erstaunt, wie On-Board-Caches in diesen Tagen sind größer als alle RAM auf einem Mini-Computer zurück in (murmeln-Dekade). Aber das wird ein hartes Stück Arbeit und nimmt Klugheit. Viel Glück!

Andere Tipps

Zwei Möglichkeiten:

Deaktivieren vollständig den Cache. Die Anwendung läuft langsamer, aber ohne Variabilität.

Vorbelastung des Code im Cache und „sperrt sie in“. Die meisten Prozessoren bieten einen Mechanismus, dies zu tun.

Es scheint, dass Sie auf x86-Prozessorfamilie beziehen, die nicht mit Echtzeitsystemen im Auge gebaut, so dass es keine wirkliche Garantie für konstante Zeitausführung (CPU Mikro-Befehle neu anordnen kann, als es Verzweigungsvorhersage und Unterricht Vorabruf-Warteschlange, die jedesmal gespült wird, wenn die CPU falsch bedingte Sprünge vorhersagt ...)

Diese Antwort wird snide klingen, aber es soll Sie denken:

  

Nur einmal, um den Code auszuführen.

Der Grund sage ich, dass ist, weil so viel wird es variabel machen und Sie könnten nicht einmal die Kontrolle über sie haben. Und was ist Ihre Definition von Zeit? Angenommen, das Betriebssystem Ihres Prozess in der Warteschlange stellen entscheidet.

Als nächst Sie Unberechenbarkeit haben aufgrund von Cache-Leistung, Speicherlatenz, Disk-I / O, und so weiter. Diese alle laufen auf eine Sache; manchmal dauert es Zeit, um die Informationen in den Prozessor zu bekommen, wo Sie den Code es verwenden kann. Einschließlich der Zeit, um es zu holen dauert / entschlüsselt den Code selbst.

Auch, wie viel Varianz ist für Sie akzeptabel? Es könnte sein, dass Sie mit 40 Millisekunden in Ordnung sind, oder du bist in Ordnung mit 10 ns.

Je nach Anwendungsdomäne können Sie sogar noch weiter nur Maske über oder um die Varianz verstecken. Computergrafik Menschen wurden Off-Screen-Puffer für die Jahre rendering Varianz in der Zeit zu verstecken, um jeden Rahmen zu machen.

Die traditionellen Lösungen entfernen ebenso viele bekannte variable Rate Dinge wie möglich. Laden Sie Dateien in den Arbeitsspeicher, erwärmen den Cache und IO vermeiden.

Wenn Sie alle die Funktion-Anrufe in den kritischen Code ‚inline‘ und minimieren die Anzahl der Variablen, die Sie haben, so dass Sie sie haben lassen Sie das ‚Register‘ Typ. Dies sollte die Laufzeit des Programms verbessern. (Sie haben wahrscheinlich es in besonderer Weise zu kompilieren, da Compiler in diesen Tagen neigen dazu, Ihre ‚Register‘ Tags außer Acht zu lassen)

Ich gehe davon aus, dass Sie nicht über genügend Speicher Seitenfehler zu verursachen, wenn Sie versuchen, etwas aus dem Speicher zu laden. Die Seitenfehler viel Zeit in Anspruch nehmen kann.

Sie können auch einen Blick auf dem erzeugten Assembler-Code nehmen, um zu sehen, ob es viele Zweige und Speicher instuctions ist, die Ihren Lauf Code ändern könnte.

Wenn ein Interrupt in der Ausführung von Code geschieht, wird es länger dauern. Haben Sie Interrupts / Ausnahmen aktiviert?

vorbelegen Speicher und stellen Sie sicher, Interrupts beeinflussen nicht den Cache (unmöglich, rechts).

/ Allan

Verstehen Sie Ihre schlimmsten Fall Laufzeit für komplexe Operationen und Verwendung Timer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top