8 logischen threads auf 4 Kernen bei maximal 4-mal schneller parallel?
Ich bin benchmarking-software, die ausgeführt wird 4x schneller auf Intel 2670QM dann meine Seriennummer-version mit allen 8 meiner "logisch" - threads. Ich möchte eine community feedback über meine Wahrnehmung des benchmarking-Ergebniss.
Wenn ich mit 4 Threads auf 4 Kerne, bekomme ich eine Geschwindigkeit von 4x, der gesamte Algorithmus ausgeführt wird, in parallell. Dies scheint logisch für mich, da 'Amdhals Gesetz", prognostiziert er. Windows task-manager sagt mir, ich bin mit 50% der CPU.
Aber wenn ich führen Sie die gleiche software auf allen 8 threads, bekomme ich wieder eine Geschwindigkeit von 4x und nicht einer Geschwindigkeit von 8x.
Wenn ich das richtig verstanden habe: meine CPU hat 4 Kerne mit einer Frequenz von 2,2 GHZ individuell, aber die Frequenz ist unterteilt in 1.1 GHZ, wenn man es auf 8 'logische' - threads, und das gleiche folgt für den rest der Komponenten, wie zum Beispiel der cache-Speicher? Wenn das wahr ist, warum dann nicht der task-manager nur Anspruch auf 50% meiner CPU genutzt wird?
#define NumberOfFiles 8
...
char startLetter ='a';
#pragma omp parallel for shared(startLetter)
for(int f=0; f<NumberOfFiles; f++){
...
}
Ich bin nicht einschließlich der Zeit, die Sie mithilfe des Festplatten-I/O. ich bin nur daran interessiert, die Zeit, die ein STL-Aufruf(STL-sort) nicht die disk-I/O.
- In meiner Erfahrung, 4 Kerne bedeutet, dass Sie tun können 4 Dinge zur gleichen Zeit mit der Straflosigkeit. 8 threads, die nur bedeutet, dass zwei threads teilen, einem Kern (vorausgesetzt, Sie sind gleichmäßig verteilt), so, es sei denn, dein code hat einige Parallelität in gebaut, können Sie nicht sehen, keine Verbesserung der Geschwindigkeit über
threads == cores
. Ihre Ergebnisse werden davon abhängen, ob Ihre algorithmen sind Prozessor-bound oder I/O gebunden. Kurz gesagt, es ist nicht so einfach, wie Sie denken. - Auf einige hardware, die Sie mehrere Instanzen von einigen Prozessor-Einheiten pro thread, aber nicht alle (z.B. nur eine FPU). Je nach der hardware-obwohl das zusätzliche "threads" dienen wenig mehr, als dass context-switches zwischen einer größeren Anzahl ausführbarer Prozesse, die viel billiger (Sie müssen nicht alles kopieren, den Staat aus jeder switch).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen i7-2670QM Prozessor hat 4 Kerne. Aber es laufen kann 8 threads parallel.
Dies bedeutet, dass es nur 4 Recheneinheiten (Kerne), hat aber eine Unterstützung in hardware zu laufen 8 threads parallel. Dies bedeutet, dass maximal vier jobs, die in die Kerne, wenn einer der jobs stall durch z.B. memory access einem anderen thread können sehr schnell starten, auf dem freien Kern mit sehr wenig Strafe. Lesen Sie mehr auf Hyper-threading. In der Realität gibt es einige Szenarien, in denen die hyper-threading gibt einen großen performance-Gewinn. Moderne Prozessoren verarbeiten hyper threading besser als ältere Prozessoren.
Ihre benchmark wurde gezeigt, dass CPU-gebunden, d.h. Es gab wenig Stände in der pipeline hätte das Hyper-Threading im Vorteil. 50% CPU korrekt ist, hat die 4 Kerne arbeiten und die zusätzlichen 4 sind nicht etwas zu tun. Aktivieren von hyper-threading im BIOS und du wirst sehen, 100% CPU.
Dies ist eine kurze Zusammenfassung von Hyperthreading/HyperTransport
Thread-switching ist langsam, dass anhalten der Ausführung, kopieren Sie eine Reihe von Werten in den Speicher, kopieren Sie eine Reihe von Werten aus dem Speicher in die CPU, dann beginnen die Dinge wieder Los mit dem neuen thread.
Dies ist, wo Ihr 4 virtuelle Kerne kommen. Sie haben 4 Kerne, das ist es, aber was hyperthreading ermöglicht es dem CPU zu tun haben, ist 2 threads auf einem single-core.
Nur 1 thread ausführen kann, in einer Zeit, jedoch, wenn ein 1-thread anhalten muss, um zu tun, einen memory-Zugriff, Zugriff auf die Festplatte oder etwas anderes ist, würde einige Zeit dauern, es kann wechseln in den anderen thread, und führen Sie es für ein bisschen. Auf alten Prozessoren, Sie sind im Grunde hatte ein bisschen Schlaf in dieser Zeit.
So Ihre quad-core hat 4 Kerne, die 1 Sache auf einmal jeder, aber Sie können einen 2. job auf standby, sobald Sie warten müssen, auf einem anderen Teil des Computers.
Wenn Ihre Aufgabe hat viel Speicher und viel CPU-Auslastung, Sie sollten sehen, ein leichter Rückgang der Gesamt-Ausführungszeit, aber wenn Sie sind nahezu vollständig von der CPU bestimmt werden Sie besser dran kleben mit nur 4 threads
Die wichtige Stück von Informationen, die zum Verständnis ist hier der Unterschied zwischen physischen und logischen Faden.
Wenn du 4 physische Kerne auf der CPU, das bedeutet, dass Sie die physischen Ressourcen, die zur Ausführung in 4 verschiedenen Threads von der Ausführung parallel. Also, wenn Sie Ihre threads nicht datenkonflikte, die Sie normalerweise Messen, x4 performance-Steigerung, im Vergleich zu der Geschwindigkeit des einzigen thread.
Ich gehe auch davon aus, dass das OS (oder Sie :)) setzt die thread-Affinität richtig, so dass jeder thread ausgeführt wird, die auf jedem physischen Kern.
Beim aktivieren von HT (Hyper-Threading) CPU-Kern-Frequenz wird nicht geändert. 🙂
Was passiert, ist, dass Teil der hw-pipeline (im Kern und rund (uncore, cache, etc)) wird dupliziert, aber ein Teil davon ist immer noch geteilt zwischen den logischen threads.
Das ist der Grund, warum Sie nicht Messen mit x8-Leistung zu erhöhen. In meiner Erfahrung, dass alle logischen Kerne kann man eine x1.5 - x1.7 Verbesserung der performance pro physischem Kern, je nach code, den Sie ausführen, cache-Nutzung (denken Sie daran, dass der L1-cache ist geteilt zwischen zwei logische Kerne/1 physikalischen Kern, zum Beispiel), thread-Affinität und so weiter und so Fort.
Hoffe, das hilft.
Einige aktuelle zahlen:
CPU-intensive Aufgabe, auf meinem i7 (addieren der zahlen von 1-1000000000 in eine int-var), 16-mal), gemittelt über 8 tests:
Zusammenfassung, threads/ticks:
Beachten Sie, dass in der 'über X threads" Linie in den berichten unten, X um eins größer ist als die Anzahl von threads zur Verfügung, um die Aufgaben - ein thread reicht die Aufgaben und wartet auf eine countdown-latch-evnet für Ihre Abschluss - it-Prozesse keine CPU-lastigen Aufgaben und benutzt keine CPU.
HT heißt SMT (Simultaneous MultiThreading) oder HTT (HyperThreading-Technologie) in den meisten BIOS-Versionen. Die Effizienz der HT hängt von der so genannten compute-zu-Holen-Verhältnis, das ist, wie viele in-core (oder register/cache) Operationen der code tut, bevor es holt aus oder speichert den langsamen Hauptspeicher oder I/O-Speicher. Für sehr cache-effiziente und CPU-bound-codes mit dem HT gibt fast keine spürbare performance-Steigerung. Für mehr Speicher gebunden codes der HT kann wirklich von nutzen sein, die Ausführung durch die so genannte "latency hiding". Das ist, warum die meisten nicht-x86-server-CPUs 4 (z.B. IBM POWER7) bis 8 (z.B. UltraSPARC T4) hardware-threads pro Kern. Diese CPUs sind in der Regel in der Datenbank-und Transaktions-processing-Systemen, wo viele gleichzeitige Speicher-gebunden-Anfragen gewartet auf einmal.
Durch die Art und Weise, die Amdhal s law besagt, dass die Obere Grenze des parallelen speedup ist ein über die serielle Bruchteil der code. In der Regel die serielle Anteil steigt mit der Anzahl der Elemente der Verarbeitung, wenn es (möglicherweise versteckt sich in der Laufzeit) Kommunikation oder eine andere synchronisation zwischen den threads, obwohl manchmal cache-Effekte können dazu führen, superlinear speedup und manchmal auch cache löschen kann die Leistung reduzieren, drastisch.