2016-04-26 18 views
6

Ich habe vor kurzem etwas in Speicher gegraben und wie man es richtig benutzt. Natürlich bin ich auch auf Prefetching gestoßen und wie ich das Leben für die CPU erleichtern kann.Gibt es eine Möglichkeit, einen Prozess "aufwärmen" zu lassen?

Ich habe einige Benchmarks durchgeführt, um die tatsächlichen Vorteile der ordnungsgemäßen Speicherung/Zugriff von Daten und Anweisungen zu sehen. Diese Benchmarks zeigten nicht nur die erwarteten Vorteile beim Vorabladen der CPU, sondern zeigten auch, dass der Prefetch auch den Prozess zur Laufzeit beschleunigt. Nach etwa 100 Programmzyklen scheint die CPU es herausgefunden zu haben und hat den Cache entsprechend optimiert. Das spart mir bis zu 200.000 Ticks pro Zyklus, die Zahl sinkt von rund 750.000 auf 550.000. Ich habe diese Nummern mit der qTestLib.

Nun zur Frage: Gibt es eine sichere Möglichkeit, diese Laufzeit-Beschleunigung zu nutzen, sozusagen aufheizen zu lassen? Oder sollte man das überhaupt nicht berechnen und nur von Anfang an schneller Code erstellen?

+0

Wenn Sie hauptsächlich von einer besseren Verzweigungsvorhersage profitieren, können Sie die Profilgeführte Optimierung für bessere Hinweise und besser optimierten Code verwenden. – Hasturkun

+1

Können Sie genauer angeben, was genau Sie bewertet haben? In welchem ​​Level-Cache sprichst du dich auf? –

+0

Beim Benchmark geht es darum, Daten im Speicher zu speichern. im Falle von diesem Vergleich std :: Vektor mit QList. Meine beste Vermutung über die automatische Cache-Optimierung ist, dass der TLB lernt, welche Adressen nicht geräumt werden sollen. – FruitSokrat

Antwort

5

Zunächst gibt es normalerweise keinen Vorteil, wenn man versucht, einen Prozess vor der normalen Ausführung aufzuwärmen: Das würde die ersten 100 Programmzyklen in Ihrem Fall nur beschleunigen und insgesamt weniger als 20000 Ticks ergeben. Das ist viel weniger als die 75000 Ticks, die Sie in die Aufwärmphase investieren müssten.

Zweitens sind all diese Gewinne durch das Aufwärmen eines Prozesses/Caches/was auch immer, eher brüchig. Es gibt eine Reihe von Ereignissen, die den wärmenden Effekt zerstören, den du normalerweise nicht kontrollierst. Meist kommen diese aus Ihrem Prozess nicht allein auf dem System. Ein Prozessschalter kann sich ähnlich wie ein asynchroner Cache-Flush verhalten, und wenn der Kernel eine Speicherseite benötigt, kann er eine Seite aus dem Festplattencache löschen.

Da die Faktoren die Rechenzeit ziemlich unberechenbar machen, müssen sie kontrolliert werden, wenn Benchmarks ausgeführt werden, die Ergebnisse von beliebiger Zuverlässigkeit liefern sollen. Abgesehen davon werden diese Effekte meist ignoriert.

-2

Es ist wichtig zu beachten, dass es nicht unbedingt eine schlechte Sache ist, die CPU beschäftigt zu halten. Idealerweise sollte Ihre CPU irgendwo zwischen 60% und 100% laufen, da dies bedeutet, dass Ihr Computer tatsächlich "arbeitet". Zugegeben, wenn es einen Prozess gibt, den Sie nicht kennen und dieser Prozess CPU-Zyklen beansprucht, ist das nicht gut.

Als Antwort auf Ihre Frage kümmert sich die Maschine normalerweise darum.

+1

Es ist eine schlechte Sache auf modernen CPUs. Je mehr sie schlafen können, desto höher können sie takten, wenn sie arbeiten müssen. Sleeping baut Power-/Cooling-Budget für "Turbo" auf. Intel Skylake macht das besser als die vorherigen Generationen und sieht sogar Gewinne in einigen Benchmarks mit stoßartiger Last (wie Javascript-Benchmarks). Ganz zu schweigen davon, dass es für ein batteriebetriebenes Gerät oder für den Fall, dass Energie/Wärme von Bedeutung ist, sehr schädlich ist, eine geringe Menge an Energie für eine geringe Leistung zu verschwenden. –

Verwandte Themen