Es wäre sehr nützlich für mich, bestimmte Programme in einer Linux-Umgebung mit einer festen (niedrigeren) CPU-Taktrate auszuführen (z. B. runat 400mhz ./my-program --argument-of="my program"
um diese Taktrate zu erhalten).
Ich brauche es, um Verzögerungen zwischen den einzelnen Assembly-Anweisungen meines Programms zu erzeugen, und es würde mich nicht töten, wenn die Verzögerung nicht genau ist (z. B. wenn sie vom OS-Scheduler abhängt, wie es fast sicher sein wird).
Das Ziel ist es, die Effizienz von Algorithmen bei der Programmierung nicht so schwerer Anwendungen in der Schule sehr deutlich zu machen (eine 3-GHz-CPU macht es schwierig, langsame Algorithmen zu bemerken, die nur wenig Zeit laufen und wirklich optimiert werden könnten). Vielleicht kann es auch nützlich sein, um die Rennbedingungen in Echtzeit zu erkennen.
Kennen Sie ein solches Tool? Gibt es eine Art Dolmetscher, den ich hacken könnte, um dies zu erreichen? Kann mir gdb relativ einfach helfen? Ich denke, es kommt der Steuerung einer mir bekannten Linux-Programmausführung am nächsten.
Das Ausführen des Hole-Systems in einer VM mit CPU-Cap könnte eine weitere Option sein, da es mir die Illusion vermittelt - eine CPU mit niedrigerer Geschwindigkeit -, aber am besten einzelne Programme ausführen.
quelle
cgexec
.Antworten:
Ich denke, die Anwendung, die Sie suchen, heißt
cpulimit
. Dies ist kein Befehl, der normalerweise in einem System enthalten ist. Sie müssen ihn daher entweder über Ihren Distribution-Paketmanager (Ubuntu / Debian) oder von der Quelle aus installieren.Ubuntu / Debian
Die Installation würde also folgendermaßen ablaufen:
Aus der Quelle
Laden Sie es so herunter:
Entpacken & bauen:
Verwendungszweck
Sie können es mit a installieren
make install
, aber im Moment verwenden wir es nur aus dem Verzeichnis, in dem wir es erstellt haben:Dadurch wird der aufgerufene Prozess
firefox
auf 30% der verfügbaren CPU-Auslastung begrenzt.Sie können es auch auf laufende Prozesse anwenden, nachdem diese aufgerufen wurden:
Sie können den Rest der Verwendung von sehen
cpulimit
:Außerdem gibt es hier auf cyberciti.biz ein gutes Tutorial zur Verwendung mit dem Titel: Linux Limit CPU Usage Per Process .
HINWEIS: Denken Sie daran, dass die CPU-Auslastung in Prozent begrenzt ist. Wenn Sie also eine Quad-Core-Box (4 CPU) haben, müssen Sie diese von 0% auf 400% begrenzen.
quelle
Möglicherweise können Sie die Uhr Ihres Prozessors einstellen, jedoch global, nicht für ein bestimmtes Programm. Prozessoren funktionieren nicht so. Prozessoren für Umgebungen mit begrenzter Leistung (insbesondere Laptops und andere mobile Geräte) unterstützen in der Regel mehrere Geschwindigkeiten.
Sie können im Prinzip festlegen, dass die Prozessorgeschwindigkeit (falls unterstützt) geändert wird, wenn Ihr Prozess geplant ist, und die Prozessorgeschwindigkeit zurückgesetzt wird, wenn ein anderer Prozess geplant wird. Mir ist keine Software bekannt, die dies unterstützt. Wahrscheinlich wäre eine ziemlich umfangreiche Änderung des Kernels erforderlich.
Sie können Ihr Programm in einer langsamen virtuellen Maschine wie Qemu (ohne KVM, damit Sie eine reine Software-Emulation erhalten) oder Bochs ausführen.
Wenn Sie mit einer niedrigeren CPU-Geschwindigkeit arbeiten, werden Sie wahrscheinlich nicht mehr Rennbedingungen haben.
Wenn Ihr Programm Multithreading ist, können Sie es zwingen, einen einzelnen Prozessor oder einen bestimmten Satz von Prozessoren zu verwenden
taskset
, z. B.taskset 3 myprogram
um nur auf den CPUs Nr. 0 und Nr. 1 ausgeführt zu werden. Wenn das Programm gezwungen wird, auf einer einzelnen CPU ausgeführt zu werden, treten wahrscheinlich weniger Rennbedingungen auf.Führen Sie Ihr Programm für Ihren Anwendungsfall mehrmals aus, anstatt es langsamer auszuführen. Wenn Sie beispielsweise beabsichtigen, dass Ihr Programm auf Geräten, die etwa zehnmal langsamer als Ihr Computer sind, eine bestimmte Geschwindigkeit aufweist, testen Sie es, indem Sie Ihr Programm zehnmal hintereinander ausführen. Das mehrmalige Ausführen des Programms erhöht die Wahrscheinlichkeit, dass Rennbedingungen auftreten.
quelle
taskset
. Sie können es auch über den-c
Schalter anweisen, dass es auf einem bestimmten CPU ausgeführt werden soll.taskset -c 0,2,4-11 myprogram
.Eine andere Möglichkeit ist die Verwendung einer langsamen Hardware - eine kostengünstige ARM-basierte Karte wie Raspbery Pi oder (etwas leistungsfähigeres) Compulab Trimslice sollte dies tun. Sie haben eine begrenzte Menge an Speicher, eine langsame CPU und können dennoch ein vollständiges Linux-System ausführen - Fedora, Debian und einige andere Distributionen haben eine ARM-Version.
quelle
Der normative Weg, dies zu tun, besteht darin, den Vorgang viele Male zu wiederholen. Wenn Sie zwei verschiedene Algorithmen haben, die dieselbe (nicht so schwere) Aufgabe X ausführen, und Sie sie vergleichen möchten, wiederholen Sie die Aufgabe X tausend- oder millionenfach. Dies erfordert möglicherweise, dass Sie ein einfaches Programm (auf hoher Ebene) schreiben, um den Benchmark zu steuern. Solange dasselbe Treiberprogramm alle Tests ausführt, erhalten Sie einen realistischen Vergleich darüber, wie schnell einer im Verhältnis zum anderen ist.
quelle
Mit cpufreq-info können Sie alle CPU-Taktraten abrufen, die von Ihrer CPU unterstützt werden. Und Sie können cpufreq-set verwenden, um eine CPU-Taktrate auszuwählen.
quelle
Führen Sie einfach Ihr Programm unter valgrind aus . Sie werden wahrscheinlich einen 50-fachen Leistungstreffer erhalten.
Als Bonus - und dies scheint Ihrem Anwendungsfall zu entsprechen - können Sie valgrind davon überzeugen , Ihnen Anrufdiagramme, Profilinformationen, verschiedene nützliche Dinge wie Fehler bei der Speichernutzung vor dem Festlegen usw. zu geben.
Zum Beispiel
erstellt eine callgrind.out- Datei. Sie können diese Profildaten in kcachegrind anzeigen , einer ziemlich netten Benutzeroberfläche.
Erinnerung: Alle Profiler lügen. Sie müssen Ihre Profiler verstehen, um den Grad der falschen Wahrheit beurteilen zu können.
quelle