Ich bin Benchmarking-Software, die 4x schneller auf Intel 2670QM ausführt als meine serielle Version, die alle 8 meiner "logischen" Threads verwendet. Ich hätte gerne Feedback von der Community zu meiner Wahrnehmung des Benchmarking-Ergebnisses.
Wenn ich 4 Threads auf 4 Kernen verwende, bekomme ich eine Beschleunigung von 4x, der gesamte Algorithmus wird parallel ausgeführt. Dies erscheint mir logisch, da das 'Amdhals-Gesetz' es voraussagt. Windows Task-Manager sagt mir, dass ich 50% der CPU verwende.
Wenn ich jedoch die gleiche Software auf allen 8 Threads ausführe, bekomme ich wieder eine Beschleunigung von 4x und nicht eine Geschwindigkeit von 8x.
Wenn ich das richtig verstanden habe: meine CPU hat 4 Kerne mit einer Frequenz von 2.2GHz, aber die Frequenz ist in 1.1GHZ aufgeteilt, wenn sie auf 8 'logische' Threads angewendet wird und dasselbe gilt für den Rest der Komponente wie der Cache-Speicher? Wenn dies zutrifft, warum behauptet der Task-Manager, dass nur 50% meiner CPU verwendet werden?
%Vor%Ich schließe die Zeit nicht mit ein, die Datenträger-E / A verwendet. Ich interessiere mich nur für die Zeit, die ein STL-Aufruf benötigt (STL-Sortierung), nicht die Platten-E / A.
Ein i7-2670QM Prozessor hat 4 Kerne. Aber es kann 8 Threads parallel laufen. Dies bedeutet, dass es nur 4 Verarbeitungseinheiten (Kerne) hat, aber Hardware unterstützt, um 8 Threads parallel zu betreiben. Dies bedeutet, dass maximal vier Jobs auf den Cores ausgeführt werden. Wenn einer der Jobs aufgrund des Speicherzugriffs zum Stillstand kommt, kann ein anderer Thread sehr schnell mit sehr geringem Aufwand auf dem freien Core ausgeführt werden. Weitere Informationen zum Hyper-Threading In der Realität gibt es wenige Szenarien, in denen Hyper-Threading einen großen Leistungsgewinn bringt. Modernere Prozessoren verarbeiten Hyper Threading besser als ältere Prozessoren.
Ihr Benchmark zeigte, dass es CPU-gebunden war, d. H., Es gab kleine Staus in der Pipeline, die Hyper Threading einen Vorteil verschafft hätten. 50% CPU ist korrekt hat die 4 Kerne funktionieren und die 4 zusätzlichen tun nichts. Schalten Sie Hyper Threading im BIOS ein und Sie werden 100% CPU sehen.
Dies ist eine kurze Zusammenfassung von Hyperthreading / HyperTransport
Die Thread-Umschaltung ist langsam, man muss die Ausführung stoppen, eine Menge von Werten in den Speicher kopieren, eine Menge von Werten aus dem Speicher in die CPU kopieren und dann mit dem neuen Thread wieder loslegen.
Hier kommen Ihre 4 virtuellen Kerne ins Spiel. Sie haben 4 Kerne, das ist es, aber das Hyperthreading erlaubt der CPU, 2 Threads auf einem einzelnen Kern zu haben.
Es kann immer nur ein Thread ausgeführt werden. Wenn jedoch 1 Thread anhalten muss, um einen Speicherzugriff, einen Festplattenzugriff oder irgendetwas anderes zu unternehmen, das einige Zeit benötigt, kann er in den anderen Thread wechseln und ihn für a ausführen Bit. Auf alten Prozessoren hatten sie in dieser Zeit grundsätzlich ein wenig Schlaf.
Ihr Quad Core hat also 4 Cores, die jeweils 1 Sache machen können, aber einen zweiten Job im Standby haben können, sobald sie auf einen anderen Teil des Computers warten müssen.
Wenn Ihre Aufgabe viel Arbeitsspeicher und viel CPU-Auslastung hat, sollten Sie eine leichte Abnahme der Ausführungszeit sehen, aber wenn Sie fast nur CPU-gebunden sind, werden Sie besser mit nur 4 Threads fertig sein
Die wichtigste Information, die hier zu verstehen ist, ist der Unterschied zwischen physischem und logischem Thread.
Wenn Sie 4 physische Kerne auf Ihrer CPU haben, bedeutet das, dass Sie über physische Ressourcen verfügen, um 4 verschiedene Ausführungs-Threads parallel auszuführen. Wenn Ihre Threads keinen Datenkonflikt haben, können Sie normalerweise eine Leistungssteigerung von x4 im Vergleich zur Geschwindigkeit des einzelnen Threads messen.
Ich gehe auch davon aus, dass das Betriebssystem (oder Sie :)) die Thread-Affinität richtig setzt, so dass jeder Thread auf jedem physischen Kern ausgeführt wird.
Wenn Sie HT (Hyper-Threading) auf Ihrer CPU aktivieren, wird die Kernfrequenz nicht geändert. :)
Was passiert ist, dass Teil der hw-Pipeline (innerhalb des Kerns und um (Uncore, Cache, etc)) dupliziert ist, aber ein Teil davon ist immer noch zwischen den logischen Threads geteilt.
Das ist der Grund, warum Sie nicht eine Leistungssteigerung x8 messen. Meiner Erfahrung nach ermöglicht das Aktivieren aller logischen Kerne eine Leistungsverbesserung von x1.5 - x1.7 pro physischem Kern, je nach Code, den Sie ausführen, Cache-Nutzung (denken Sie daran, dass der L1-Cache zwischen zwei logischen Kernen / einem physischen Kern geteilt wird) zum Beispiel), Thread-Affinität und so weiter und so fort.
Hoffe, das hilft.
Einige tatsächliche Zahlen:
CPU-intensive Aufgabe auf meinem i7, (Zahlen von 1-1000000000 in eine int var, 16-mal), gemittelt über 8 Tests:
Zusammenfassung, Themen / Ticks:
%Vor%Beachten Sie, dass X in der Zeile "using X threads" in den unten stehenden Berichten um eins größer ist als die Anzahl der für die Aufgaben verfügbaren Threads - ein Thread übergibt die Aufgaben und wartet auf einen countdown-latch evnet, um sie abzuschließen. Es verarbeitet keine der CPU-schweren Aufgaben und verwendet keine CPU.
%Vor%HT wird in den meisten BIOS als SMT (Simultaneous MultiThreading) oder HTT (HyperThreading Technology) bezeichnet. Die Effizienz von HT hängt vom so genannten Compute-to-Fetch-Verhältnis ab, das heißt, wie viele In-Core- (oder Register- / Cache-) Operationen Ihr Code vor dem Abrufen von oder dem Speichern im langsamen Hauptspeicher oder I / O-Speicher ausführt. Für hoch Cache-effiziente und CPU-gebundene Codes gibt die HT fast keine spürbare Leistungssteigerung. Für mehr speichergebundene Codes kann die HT aufgrund des sogenannten "Latency Hiding" wirklich von der Ausführung profitieren. Aus diesem Grund stellen die meisten Nicht-x86-Server-CPUs 4 (z. B. IBM POWER7) bis 8 (z. B. UltraSPARC T4) Hardware-Threads pro Kern bereit. Diese CPUs werden normalerweise in Datenbank- und Transaktionsverarbeitungssystemen verwendet, in denen viele gleichzeitige speichergebundene Anforderungen gleichzeitig bearbeitet werden.
Übrigens besagt das Amdhal-Gesetz, dass die obere Grenze der Parallelbeschleunigung eine über dem Serienbruchteil des Codes ist. Normalerweise nimmt der Serienanteil mit der Anzahl der Verarbeitungselemente zu, wenn (möglicherweise in der Laufzeit verborgen) eine Kommunikation oder eine andere Synchronisation zwischen den Threads stattfindet, obwohl Cache-Effekte manchmal zu superlinearer Beschleunigung führen können und Cache-Trash manchmal die Leistung drastisch reduzieren kann >
Tags und Links multithreading openmp multicore