3 Stimmen

Wie kann ich eine Testanwendung schreiben, die die CPU voll auslastet?

Die CPU ist so konzipiert, dass sie in den Energiesparmodus wechselt, wann immer sie kann, um Strom zu sparen und kühl zu bleiben, ich möchte ein Programm erstellen, das dies verhindert.

Ich arbeite an ein paar verschiedenen Embedded-Plattformen (Freescale Coldfire 8052, TI Sitara AM3359, wahrscheinlich ein paar andere in der pipeworks) und so wollte ich eine Anwendung, die nur halten die CPU voll für Benchmarking geladen wird. Ich möchte meine eigene Anwendung schreiben, da es einfacher wäre, sie zu kompilieren, als nach einer Lösung für jedes Ziel zu suchen.

Mein erster Gedanke war einfach:

while(1);

Frage 1:
Aber wenn ich das zu sehr vereinfache? oben zeigt, dass das Programm etwa 99,4% CPU-Auslastung, so dass ich denke, es funktioniert, aber es scheint nicht, wie es so einfach sein sollte :) Weiß jemand, ob es mehr als das sein sollte?

Frage 2:
Wenn ich das System auf verschiedene Lasten (z. B. 50 %, 75 % oder was auch immer) erweitern wollte, wie könnte ich das tun? Ich habe es geschafft, eine 18~20% CPU-Nutzung über zu bekommen:

while(1){usleep(1);}

Gibt es eine wissenschaftlichere Methode, als nur zu raten und die Schlafwerte zu überprüfen? Ich würde denken, dass diese ohnehin von Ziel zu Ziel unterschiedlich sein würden.

3voto

CAFxX Punkte 23026

while(1); verbraucht alle CPU-Zyklen, beansprucht aber die meisten Teile der CPU nicht (geschweige denn den Grafikprozessor). Die meisten modernen CPUs sind in der Lage, einzelne Ausführungseinheiten selektiv abzuschalten, wenn sie nicht genutzt werden: Das ist die einzige Möglichkeit, dies zu verhindern:

  1. dem CPU/SoC-Treiber mitzuteilen, dass er die Energiesparfunktion deaktivieren soll
  2. alle Steuer- und Ausführungseinheiten Ihrer CPU/GPU/Chipsatz/etc. ausüben.

1voto

Florin Stingaciu Punkte 7735

Ich werde also versuchen, dies als Antwort zu posten. Wenn Sie sich ansehen, was die Spezifikationen für schlafend sind, werden Sie die folgende Zeile bemerken:

Die Funktion usleep() bewirkt, dass der aufrufende Thread von der Ausführung suspendiert wird...

Das bedeutet, dass 18 bis 20 % der CPU-Nutzung auf den Kontextwechsel entfallen. Das while(1) in Ihrem Code wird CPU-Zyklen verbrauchen, weil es geplant wird, aber es wird die CPU nicht voll auslasten. Es gibt viele Optionen für C-Programme, die versuchen, die CPU zu 100% auszulasten. Die meisten von ihnen verwenden mehrere Threads, gemischt mit mathematisch basierten Anwendungen.

Siehe dies Gewinde für eine Reihe von Beispielen.

1voto

Art Punkte 19391

Eine while(1); -Schleife wird höchstwahrscheinlich die ganze Zeit laufen, wenn das Betriebssystem nicht gerade andere Dinge tut, wie z.B. Interrupts verarbeiten oder Daemons ausführen. Das Problem, das Sie haben, ist, dass top nicht wirklich anzeigt, wie viel Zeit Ihr Programm tatsächlich gelaufen ist, sondern eine ziemlich grobe Schätzung, die für interne Planungsberechnungen verwendet wird. Auf manchen Systemen kann die CPU-Auslastung bei über 100 % liegen, nur weil die Berechnungen ein wenig daneben liegen.

Wenn es darum geht, die CPU richtig zu laden, hängt es davon ab, was Sie tun wollen. Jeden Teil des Prozessors berühren? Maximaler Stromverbrauch? Das ist keine einfache Frage, vor allem, wenn Sie wahrscheinlich nicht wissen, was die Frage eigentlich ist.

0voto

Mark Lakata Punkte 18998

Sie können die yes Befehl, um einen Prozess zu haben, der 100% CPU verbraucht.

yes > /dev/null &

Lesen Sie die Manpage für yes, um zu sehen, was es tut. Es ist ein ziemlich dummes Programm, das nur dazu dient, Programmen, die den Benutzer um eine Bestätigung bitten, immer wieder mit "yes" zu antworten.

Wenn Sie auf eine Datei umleiten, können Sie auch umfangreiche Datei-IO simulieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X